「RGB」を含む日記 RSS

はてなキーワード: RGBとは

2019-01-03

anond:20190103184241

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//

	int blocks[100][100];

	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		x = 0;
		y = 0;
		boxType = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		for(int x = 0 ; x < 100 ; x++)
		{
			for (int y = 0; y < 100; y++)
			{
				blocks[y][x] = 0;
			}
		}

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int x;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 100 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	int boxType;

	BOOL WriteBoxOLDBox()
	{
		int width = 24;

		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 48));
		for (int y = 0; y < 30; y++)
		{
			for (int x = 0; x < 8; x++)
			{
				if (blocks[y][x] == 0)
				{
					continue;
				}

				RECT Rect = { 0,0,48,48 };
				BOOL ret;

				Rect.left = width * x + 1;
				Rect.right = width * (x + 1) - 1;
				Rect.top = width * y + 1;
				Rect.bottom = width * (y + 1) - 1;

				ret = FillRect(hdc, &Rect, hBrush);


			}
		}

		DeleteObject(hBrush);

		return FALSE;
	}


	BOOL WriteBox()
	{
		WriteBoxOLDBox();

		switch (boxType)
		{
		case 0:
			return WriteBoxI();
		case 1:
			return WriteBoxL();
		case 2:
			return WriteBoxZ();

		}

		return TRUE;
	}

	BOOL WriteBoxZ()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left += width;
		Rect.right += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);


		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL WriteBoxL()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 246 , 48));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) -1 ;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) -1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left   += width;
		Rect.right  += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL WriteBoxI()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB( 246 , 48 , 48));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL SaveBoxI()
	{
		blocks[y  ][x] = 1;
		blocks[y+1][x] = 1;
		blocks[y+2][x] = 1;
		blocks[y+3][x] = 1;
		return TRUE;
	}


	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 20) {
			switch (boxType)
			{
			case 0:
				SaveBoxI();
				break;
			case 1:
				break;
			case 2:
				break;
			}

			y = 0;
			boxType++;
			if (boxType > 2)
			{
				boxType = 0;
			}
		}

		this->WriteBox();

		return TRUE;
	}



	BOOL OnKey(WPARAM wParam)
	{
		if (wParam == VK_LEFT)
		{
			x++;
		}
		if (wParam == VK_RIGHT)
		{
			x--;
		}
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
		break;
	case WM_KEYDOWN:
		{
			MyWindow *target = MyWindow::find(hWnd);
			target->OnKey(wParam);
		}
	break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

anond:20190103170543

テトリス

落ちてくるブロックの描き方

わかりやす関数化してみた

まずはブロックの種類は3種類

 

WriteBoxLとWriteBoxIとWriteBoxZ

の違いをよく見比べて

自力で違いがわかれば

プログラマーにはなれるとおもう

とはいえ、コレを自力でわかるならもっと儲かる仕事あるとはおもうけどな

 

	BOOL WriteBox()
	{
		switch (boxType)
		{
		case 0:
			return WriteBoxI();
		case 1:
			return WriteBoxL();
		case 2:
			return WriteBoxZ();

		}
	}
// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		x = 0;
		y = 0;
		boxType = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int x;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	int boxType;

	BOOL WriteBox()
	{
		switch (boxType)
		{
		case 0:
			return WriteBoxI();
		case 1:
			return WriteBoxL();
		case 2:
			return WriteBoxZ();

		}
	}

	BOOL WriteBoxZ()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left += width;
		Rect.right += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);


		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL WriteBoxL()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) -1 ;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) -1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left   += width;
		Rect.right  += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL WriteBoxI()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 8) {
			y = 0;
			boxType++;
			if (boxType > 2)
			{
				boxType = 0;
			}
		}

		this->WriteBox();

		return TRUE;
	}



	BOOL OnKey()
	{
		x++;
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
		break;
	case WM_KEYDOWN:
		{
			MyWindow *target = MyWindow::find(hWnd);
			target->OnKey();
		}
	break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

anond:20190103155208

これで、ブロックを4つ書くからテトリス

	BOOL WriteBox()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) -1 ;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) -1;

		ret = FillRect(hdc, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 8) {
			y = 0;
		}

		this->WriteBox();

		return TRUE;
	}


anond:20190101175055

テトリス風?プログラムに向けて

第何回だろうな

キー入力を追加した

まだ、何を押してもブロックが右に移動するだけ(右端にいくと左にワープ

タイマー自動落下

 

でもまぁ ここまでサンプルがあるとほぼテトリスは見えてきた

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		x = 0;
		y = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int x;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		Rect.left = 48 * x;
		Rect.right = 48 * (x+1);
		Rect.top = 48 * y;
		Rect.bottom = 48 * (y+1);
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 8) {
			y = 0;
		}
		BOOL ret = FillRect(ps.hdc, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL OnKey()
	{
		x++;
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
		break;
	case WM_KEYDOWN:
		{
			MyWindow *target = MyWindow::find(hWnd);
			target->OnKey();
		}
	break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

2019-01-01

anond:20190101174449

描画部分の違い

変数 y をつかって

高さが8までで移動するように

yが変わると■のいちも変わるから

タイマーで呼び出されるたbに

下へ 下へと作画される

から まぁ アニメーションに見える

8のところを16に変えれば もっと長いアニメーションになる

次はタイマー部分を説明

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		Rect.top = 48 * y;
		Rect.bottom = 48 * (y+1);
		if (y > 8) {
			y = 0;
		}
		BOOL ret = FillRect(ps.hdc, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}

anond:20190101172100

タイマーを使ったアニメーションを付けた

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		y = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		Rect.top = 48 * y;
		Rect.bottom = 48 * (y+1);
		if (y > 8) {
			y = 0;
		}
		BOOL ret = FillRect(ps.hdc, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

anond:20190101171914

ソース全部だと長いけど ようするに

違いはこの部分

CreateSolidBrush が 色を決めている

Rect で位置と大きさを

FillRectで書いている

英語が読めればかなり簡単

OnPaint=作画関数

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		BOOL ret = FillRect(ps.hdc, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}

anond:20190101162210

やすいように フルソー

青い■を表示するだけ

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);


		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;

	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));

		// メイン メッセージ ループ:
		while (GetMessage(&msg, nullptr, 0, 0))
		{
			if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		BOOL ret = FillRect(ps.hdc, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

2018-12-24

セキュリティ制限WindowsOfficeだけの環境アウトプットやす方法はないもの

ウイルスチェックマカフィーで裏で動くと処理が重たくなり、メール主体Outlookを使い、ファイルシェアSharePoint

会議室探すのも表示が遅くて20秒ほど待たないといけないし、そもそもない。

毎日パワポ資料を作るが、文字だけで説明しても理解してもらえないので、パワポ上で絵をカキカキする毎日

社内の人数は多いがアクセスできる情報が限られており、基本自分が参加したことのあるプロジェクト情報しか手に入らず、社外へプレスリリースされて初めて自社のことを知る。

メールは基本読んでも返事はなく、会議を開かないと何も進まないが、事前に意見を返信してもらえればいいが、こういう場合はどうするのか検討しているのか、Pros Consはどうなのかと質問され、

Pros Consの数案に対してスケジュール複数作り、調整している間に状況が代わりリスケ


誰もが効率悪いと感じてるのだが、誰もが専門家ではあるのだが、会社の仕組みに対してのプロではないことと、

本やネットで話題になっていることは、前提に色々システムがある前提で、自社に対しては役に立たない…。


新しい仕組みに対してどれだけ効果があるのか数値化しないといけないため、パソコンスペック更新のたびに悪くなるのだが、

経費削減で利益に貢献できているようなのだが、会議室RGBケーブルしか対応していない古いプロジェクタに接続できなかったりする。


働き方改革リモート」と一部の企業利益になるもの以外に、仕組みが必要なのだメディアも取り上げなければ、展示会もない。

2018-11-17

anond:20181117043632

トレンドみたいなものがあって、PCパーツ界隈の今のトレンドRGBLED自由な色で光らせる)なんだよ

2018-10-01

anond:20180930022000

HDR関係ないだろというブコメを見て「ん?」と思ったのだが、多分そいつらの言ってるのはスマホHDR撮影機能のことかね。あれは複数写真を合成してるだけの別物で本来HDRRGBそれぞれ16bit浮動小数表現したりする技術のこと。実際はもっと説明が複雑だけど。

2018-09-30

数字的にすごく思えるけど実は足りてないもの

  • 光の速度

秒速30万km、1秒間に地球を7周半と聞くと天文学的数字に思えるけど、60fpsのゲームでは1フレームで5000kmしか届かず、日米間での通信対戦などができない。

  • 1677万色

True Colorと言われこれで十分と思われてた節があるが、24ビットなのでRGBそれぞれ8ビット、256段階しかない。輝度の高い部分や低い部分に着目すると足りなかったりする。だからHDRなんてものができたわけだけど。

他には?

2018-06-15

anond:20180615192108

じゃあ画面の端っこにチラシの但し書きみたいに「このサイトマイニングしてます」みたいな表示なら許される?

RGBのどれかがちょっと違うだけの同系統の色での但し書きは?

認識できる、できないの境界線を誰が引くんだろうね?

今回のcoinhiveの逮捕劇で気になるのは、法定速度が決まってないのにスピード違反で取り締まってるように見える事なんだよな。

2018-01-12

https://anond.hatelabo.jp/20180111135207

https://anond.hatelabo.jp/20180112100435

89は確かに読めました。でも、これが色覚異常者が見たいと願う色の世界でしょうか。

これだけ見るとすごく暗いしコントラストが小さいよね。

ただ、暗い部屋での人の目の順応性のことを思うと、わりとホワイトバランスをうまく調整してくれてそれなりに見えるんじゃないかとも思う。

ところが元の増田も、また、その増田ブコメでいくつか言及されていた色覚異常者が色彩に出会って感動する動画も、それらのリアクションは全て未知の色彩と出会う驚きによって演出されています

これは同感。そこまで未知の色彩があるわけない。それもたかフィルター通しただけで。

まり、どれだけ色のバランスを整えたとしても、今まで感じたことのなかった彩度以上の色彩を感じることはありえません。

ただ、自然界がすべての光の波長のパターン網羅しているわけでもないと思うので、より色鮮やかに見えるパターンというのはあり得るかもしれないと思う。

実際自分場合紅葉や赤いバラは肉眼で見ても暗い赤にしか見えないが写真テレビで見るとものすごく鮮やかな赤に見える。

これらを組み合わせて、この製品が嘘だという最大の根拠を一つ示します。

特定の色の彩度を下げることで鮮やかな世界を作れるとするのであれば、どうして症例にあわせた作例が一つもないのでしょうか。

レタッチソフトを使えばRGBバランスを変えることは造作も無いことです。

それぞれの色覚異常症例にあわせて、その人がメガネを掛けることで見える世界簡単再現できるはずです。

だって、そこにある色を減らすだけの話ですから

この辺は微妙

そもそもこの世に存在するRGBやらCMYKというのは色覚正常者にとって最適化されたものなので、色覚異常者にとってはそもそもがずれたものだ。

光というのは本来様々な波長を含むもので、全く同じ色に見えるものでも物質が違えば違う波長の光を含んでいる。

そういう性質を利用して色覚正常者だけが自然光と同じに見えるようなRGB三色光とCMYKインクを選んでいるにすぎない。

とても繊細な調整が必要で、モニターによって色は変わるし、インクロットが違えば色も微妙に変わる。再現度を高めるために色校正必要とされる理由である

モニター印刷物は1つ1つで発色の加減が微妙に違うのに、色覚正常者はだいたい同じように見えるように調整している。

言い方を変えると、本当は違う色(光)が出てるのに色覚正常者はその違いを認識できない。

これはあくまで色覚正常者向けの調整なので、極端に言うと色覚異常者にはどれも違うように見えてしまう。

から、作例がないというのは仕方のない話で、やろうと思っても画像ファイルだけを用意すればいいというものではないのだ。

専用のモニターを用意してそのモニターだけで見るようにすればできるかもしれない。

印刷物場合指定インクを使ってきっちり色校正するようにすればできるかもしれない。

(これを実際にやっているのが色覚検査表。あれって自分で買うとものすごく高いのだけどそれだけ手間はかかってる。

ウェブサイトで公開されているものははっきり言って無意味

http://www.neo-dalton.com/side/check/が簡易的と言っているのもそのため。これは専用のモニターを使ってるはず。)

あと症例に合わせた作例というのも難しいのではないか

これまでの自分の実感だと赤緑色弱は本当に個人によって見え方が全然違う。

この増田自身は赤緑色盲(2色型色覚)なのではないかと思うが、赤緑色盲向けの作例であれば可能ではないかと思う。

ただそれをやるのは結構お金がかかると思うよ。レタッチで済むというものではないだろうから

そうはいっても例えば紅葉が綺麗だと言われる度に、他の人が見えている世界を見たいと願う自分がいます

分かる。

でも彼らには見えてないものが僕らには見えているはずでそっちを楽しんで生きていきたい。

色覚異常で困った話とか

色覚補正レンズの話が上がってたから思い返し

自分はもともと先天赤緑色覚異常だったのに加えて20代スティーブンス・ジョンソン症候群wikiは閲覧注意かも)に罹って後遺症?で眼に影響がでたっていう変な状況。

以下、困った思い出とか

1.幼少期のお絵描。クレヨンに色名を書いた紙がないと赤、茶、緑とかの区別がつかない。

から蓋の裏に色名が書いてあったクーピーしまう順番間違えると大変。

2.信号場所で覚えた。色自体区別はついてない。運転免許は持っていないので特に不便はない。

3.パズルゲームぷよぷよはぎりぎり形で判別できたけど、ときメモぱずるだまは出来なかった。パズドラ補正ちょっとしかった。

4.路線図特に都内。違う路線かわからないこともある。

5.小学生時、紅葉を見て「綺麗だね」と言った母に「よくわからないんだ」と返してしまたこと。

このことがきっかけで色覚検査をうけたような覚えがある。検査後母に謝られたのはなんか今でも良く覚えてる。

誰も悪くないのに難しい。

6.家電電子機器のお知らせランプ。「正常時は緑、エラーときは赤」みたいなの。

大きいと周りとの差で何となく分かることもあるけど小さいとどっちにしろ光ってるだけの代物

7.UNO。有名。去年だっけ、色覚異常者向けのが出来たのって。

8.焼肉。有名。焦げ始めないとわかんない。

9.黒板に色付きチョーク。白、黄、青のチョーク以外は何書いてあるかわからないこともあった。

後遺症と思われるもの

10.黄色系の色が目に刺激が強すぎて眼鏡レンズに色を入れるようになった。色覚補正レンズではないただ色の入ったレンズだけど。

11.体調次第で明るさに凄い補正がかかる時がある。晴れてる昼間なのに薄暗かったり。大体夕日が完全に沈んじゃったくらいの暗さかな

今までの対応場所とか他の要素で判別できるものがあるときはそれを機械的に覚えちゃう

色でしか区別がつかない時は周りに頼るか、諦める。なので事前に周囲にわかってもらってると楽。

生活の中では単品で何色か判断することよりも何かと比べて何色だって判別することのほうが多いような気がするし。

なので色以外で判別できるように形だったり文字入れたりとかして欲しいもの結構ある。

PCをいじり始めてRGBって概念知ってからは色々判別は楽になったな。数値化できるって素晴らしい。

お陰で初音ミクの髪の色が随分緑がかってるんだなってわかりました。

anond:20180111135207

色覚異常者です。

もう手遅れかもしれませんが、本当に本当に辛い思いをしている人間を、さらにその希望まで踏みにじるようなことは止めてください。

残念ながらこの製品フェイクであり、この体験記もフェイクです。

それがフェイであることは、このサイトの中で簡単証明できます

増田にも言及があったこのページを御覧ください。

http://www.neo-dalton.com/side/check/

色覚異常であるわたしは、一般とされている画像が52と読めます

(健常者に確認を取ったわけではありませんが、ここにはおそらく89と書かれているのではないでしょうか。)

そして画像の番号が進むと同時に89という文字が視認できるようになります

わたしはA7で視認できました。

気づきでしょうか。

まりこれが、わたしが89を正しく認識できる色の世界です。

89は確かに読めました。でも、これが色覚異常者が見たいと願う色の世界でしょうか。

52と読めてしまう背景には、健常者であれば区別できる色の違いが色覚異常者には区別できないことに原因があります

健常者であれば区別できる数色が、色覚異常者には緑のような茶色のような灰色のようなどれとでも取れるような色に見えているのです。

それを色覚異常者でも色の区別ができるようにするには、こうして世界全体の色を替える以外に手段はありません。

まり、この画像が色覚矯正メガネをかけて見える世界ということです。

世界から緑をなくせば紫に転ぶし、赤をなくせばシアンに転びますDTPをやったことある人間ならすぐにピンとくる話だと思います

かに青ははじめよりも青く感じるので一概に元の増田が嘘とはいえませんね。

色覚異常とは、ある特定の色に対してそれ以上の彩度を感じられない症状のことをいいます

まり、どれだけ色のバランスを整えたとしても、今まで感じたことのなかった彩度以上の色彩を感じることはありえません。

ところが元の増田も、また、その増田ブコメでいくつか言及されていた色覚異常者が色彩に出会って感動する動画も、それらのリアクションは全て未知の色彩と出会う驚きによって演出されています

おかしいですよね。今以上の彩度を感じられる器官を持たないのに、メガネをかけると見えるだなんて。

まりそれらは矛盾であり、感動ポルノを作り出すための演出であることがわかります

これらを組み合わせて、この製品が嘘だという最大の根拠を一つ示します。

特定の色の彩度を下げることで鮮やかな世界を作れるとするのであれば、どうして症例にあわせた作例が一つもないのでしょうか。

レタッチソフトを使えばRGBバランスを変えることは造作も無いことです。

それぞれの色覚異常症例にあわせて、その人がメガネを掛けることで見える世界簡単再現できるはずです。

だって、そこにある色を減らすだけの話ですから

それが出来ないのだから、残念ながらこの製品フェイであると言わざるを得ません。本当に残念です。

もしこれが配色を変えることで色の境界をわかりやすくする程度の製品であれば疑いません。

しかし、今以上に鮮やかに見えると謳うのであれば、それは詐欺しかいいようがありません。

色覚異常に同情し、それが解決できた気持ちを喜んでくれることは本当にありがたいことです。

から、元の増田ブコメが沢山ついたことも、あの動画に沢山の感動が寄せられたこともとても好意的に思っています

しかし、残念ながらその行動が、詐欺助長してしまう結果になっていることは本当に遺憾です。

自分趣味写真をたしなみます

始めの頃は肌色再現できずに相当悩みましたが、いまではあえて特定色の彩度を下げることで自分しか見えていない世界写真として表現するようになりました。

その独特の色彩感覚が人には面白いらしく、むしろ被写体の色が湧き上がってくるような写真だと周囲からもとても好評です。

(誤解のないように付け加えますが、この写真意識しないと気づかない程度に被写体以外の彩度を失わせるという演出です。こちらでいうようなすべての色が色彩を増すわけではありません。)

自分色覚異常者として生活を続けることでたどり着いた結論は、「失うことは得ることと同意」ということでした。

普段人ができないような何かを失う経験のものが、かえがたき貴重な経験として得られるものからです。

それならばないことを嘆くより、得られたものを喜べたほうがよいですよね。

そういう様に考えるようになってからは、自分が人よりも劣った存在だとは感じないようになりました。

これは同じ問題に悩む人間全員に一番に伝えたい事でもあります

そうはいっても例えば紅葉が綺麗だと言われる度に、他の人が見えている世界を見たいと願う自分がいます

からこういう製品記事流れる度に、どこかに期待してしま自分が否めません。

もしこれが詐欺だったときに涙をながすかもしれない人を想像してもらえるなら、ほんの少しだけその感動を安直シェアするべきか踏みとどまって頂けたら幸いです。

2018-01-11

色覚異常補正レンズを買った

私は先天性の色覚異常であるwiki先生によると色覚多様性という言い方もあるらしい)。

もっとも、「最後の赤と緑、赤い方を切れ!そうすれば爆発を回避できる!」……みたいな経験もないので、仕事日常生活にはさほど困ってはいない。

ただ、興味本位日常些細な問題靴下の色を取り違える、焼けてない肉を食べそうになる etc.から、先日、色覚補正レンズを購入した。

色覚異常を持つ人は男性で約5%の割合でいるそうだ。強弱はともあれ、佐藤鈴木高橋姓を足した人数くらい、先天的にその特性を持っているはずである

まぁ、日常生活で気付くことはまず無理だし、赤の他人から指摘するのも(たぶん)躊躇われるし、で同様に困ってる人にはまだリアルで遭遇していない。

自身場合は母方祖父がそうだったため、家族からの指摘で比較的早い段階で気付くことが出来た。

早い段階で気付けたことと、見分けのつきにくい色もバンバン他人に聞くことができるので、生活のしづらさはない。

ユニバーサルデザインというのもだいぶ浸透していて、色だけで何かを区別しなければ行けない状況もほぼない。

職業により多少の制限はあるものの、この制限自体絶対的必要だと思うから、あとは世間理解さえ追いついてもらえれば楽かなぁと思う。

ただ、世間に対して偉そうに言ったものの、自分自身もよくわかっていない。

認識のズレがどの程度のあるかなどは、結局は自身経験則しか語れず、

しかもその経験則でさえ「この色とこの色は見分けづらい」と言うと、一般人でも見分けづらいと言われてしまうこともあり、いまいち説明しづらい。

webにも幾つか判定ツールが転がっているが、画面の発色とかの環境依存によるところもあると思っていて、あまりあてにしていない。

ということで、自身色覚異常検査とともに、結果次第では補正レンズの購入をしようかなと思った次第である

お世話になったのはここ↓(というかそういうレンズをちゃんとした所から買うなら、現状ここ一択にならざるをえないと思う)

http://www.neo-dalton.com/

いたこともない会社電話するのも勇気がいったのだが、思っていた以上にあっさり予約できた。

予約の際に年齢・職業も聞かれて、ちょっと怪しいなぁ……とその時は思ってしまったが、

検査で低年齢の人には遺伝の話は嫌がられるからしないだとか、職によっては制限があるとかの理由を聞けて一安心

一日の対応件数も限られているらしいので、あっさり予約できたのはラッキーだったとのこと。

検査を終えて、自分はここ(http://www.neo-dalton.com/side/check/)でいうA7(中程度)だった。

強い異常でもなければ弱い異常でもないとのこと。

そのままレンズ購入を勧められ、まぁ何だかんだで買ってしまった……。

補正レンズで幾つかの風景静物写真を見たが、少し色が鮮明になったかなくらいの認識で、正直、財布から失われたレンズ代(70,000円)の衝撃の方が大きかった。

ちなみに、色覚補正レンズ自体に度は入れられない。

私は近眼用のメガネを常用しているので、そこの近所のメガネ店で売っている跳ね上げ式のメガネフレームとかも紹介されたが、

流石にこれはないだろう……と思って、フレーム自分で探すことにした。

フレーム探しは思っていた以上に大変だった。

受取のことも考えて、まずはHPにも載ってるレンズ業務提携している大手メガネ屋さんを当たってみた。

「これくらいしかありません」と、定員さんに言われて見せられたのが、

種類は金属フレームのみでそこそこのお値段、出来上がりも10日程と、非常に考えさせられるような内容だった。

(ここまで不遇なのか……)

その後、色々お店を回った結果、普段からお世話になっているお店の別店舗で何とかフレームを見つけ、1時間程度で仕上げてもらった。

これも運が良かったと思う。メガネフレーム流行り廃り次第では、ジジババがかけているようなメガネしか見つからいかもしれない。

出来上がったメガネを装着し、周囲を見渡したが、それほど変化もなく、こんなもんかと思った。

しろ特殊レンズの反射で視界不良というのが第一印象

(まぁ、せっかく買ったし、これを付けて外に出てみるか……)

(ん……!!)

(空が青い)

メガネを外して空を見上げ、再度メガネを付けて見比べてみる。

(深みが増したというか分かんないけど、明らかに青い!)


補正レンズ原理の詳細はここ(http://www.neo-dalton.com/genri/)に記されているが、要はRGB(赤緑青)のバランス矯正するためのレンズで、

自分場合は緑の感度を大幅に弱め、青の感度を少し弱めることでバランスをとっている。

ということは、今まで大して緑っぽく見えてなかった色や青っぽく見えていなかった色が突然鮮明な緑や青として見えるようになった、みたいな話らしい。

スマホホーム画面を見たときも衝撃だった。

Chromeアイコン中央の青と左下の緑がくっきり見えるし、LINEアイコンあんなに緑々しい色をしているとは夢にも思わなかった。

当初は赤緑の区別ができれば、まぁいいかなくらいに思っていた補正レンズだったが、まさかこういう派生効果が生じるとは。

押し切られて買ってしまったときは、流石にどうなることかと思ったけれど、いい買い物をしたなぁと思った。

同時に、世間一般にありふれてる配色の妙を少しでも感じ取ることが出来てよかったなぁと思う。

企業ロゴ、街中の看板、周りの人の服装、……多くのことで、実はこんな色だったんだな、こっちの配色の方がしっくりくるなと感じる。


願わくは、色覚補正レンズもっと普及し、もっと手頃な金額でこの感動を得ることが出来ますように、と。

2017-11-24

デザイン仕事してるとクライアントから「この写真を表紙に使ってよ」という話はよくあるんだけど、だいたいそういう写真って使いにくい。

まずフレームいっぱいに対象物が収まってるパターン文字を置くスペースがないし、トンボの断ち切りの余白もないから怖い。

もっと引いて写真撮ってと言うんだけど伝わらない。

次に対象物が歪んでるパターン。近くによらず、ズームで近づけて欲しいんだけど何故かみんな近くに寄って撮りたがる。結果歪む。

ピンボケや逆光で景色がよくわからないパターン。それホントにいい写真だと思ってるのかな。

解像度の不足してるパターンスマホで撮った写真やインスタ写真をそのまま転送。荒い写真しかならなくて致命的。あとネットで拾ってきた写真とか。

RGB感の強い写真パターンCMYKなっちゃうので綺麗に抜けた青空とか蛍光色っぽいのとか難しい。

電柱とか電線とかフォトショで取り除いてよパターンしんどいのでやりたくない。

この辺がクリアできてようやくスタート地点です。がんばって!

2017-06-30

神のブラウン管ブラウン管廃棄処分覚書)

シャープブラウン管使ってる。先月Xbox360買って中古テレビ探しに行ったら見た瞬間に即決した。

カッコイイ、マジで。そして速い。アイマスを見ると遅延無い。マジでちょっと 感動。

しかブラウン管なのにD3ついてるから画質も綺麗でよい。D3プログレッシブスキャンが無いと言われてるけど個人的には綺麗と思う。

HDMIと比べれば、そりゃちょっとは違うかもしれないけど、そんなに大差はないって店員も言ってたし、それは間違いないと思う。

ただ、文字が細かいちょっといね※1。D端子なのにちょっとぼやけてるし。

フレームレートに関しては多分D3HDMIも変わらないでしょ。HDMI見たこと無いから知らないけど、デジタル端子があるかないかでそんなに変わったらアホ臭くてだれもD3なんてかわないでしょ。個人的にはD3でも十分に綺麗。

嘘かと思われるかもしれないけど大阪堺のドンキホーテジェネリックレグザを抜...くのは無理だと思ったので、買い替えた。つまり、その足でエディオンへ行き処分をお願いした※2という訳で、それだけでも個人的には大満足です※3.

※1 A列車文字の細かさと言ったら泣ける。あれはアナログRGBD4じゃないと無理。当時はHDMIな箱〇持ってなかった。

※2 お店で申し込み時。「この時間帯なら引き取りに伺う配送係の空きがあります」という感じの、宅配便に近い時間指定方法。15分くらいで受付終了。平日6~9時おすすめ。本人が自宅にいれば、サイン一つで引き取り。リサイクル関係書類は向こうが書いてくれる。

※3 堺市本社のあるシャープ16インチ以上ブラウン管場合、5076円(税込)。リサイクル料金2916円+引き取り料2160円。店で買い物しなくても、引き取りだけでもOK.ヤマダ、ケーズ、ドンキホーテ比較して、一番安い。しか店員レベル高いという事で大満足。

補足。

32インチブラウン管の重さは約50kg。怪力でも腰を痛める可能性があるので、必ず2人以上で運搬しましょう。引き取り当日は、若い男性配送員2人で運んでました。

ブラウン管処分は多分本当の話です。ジェネリックレグザは予約すらできてません。欲しい。

2017-05-21

昔は青と緑は同じ仲間という認識があったそうだけど、昔は青は黄色系の青しか自然界になかったんだと思う。

赤系の藍色とかコバルトブルーとかなかったっぽい。

ガンダムセンチネルでもコバルトブルーを作るのにかなり苦労してたみたいだし。

赤系の青って今でもCMYKで出しにくい。

からの色はCMYK再現できるレベル範囲しか認識がなかったんだろうな。

RGBの豊かな色彩を見たら腰抜かすだろう。

2017-05-10

クロスブラウザ対応しろとか言う奴

あなた方のせいで私は今日もおうちに帰れないのです

Webサイトクロスブラウザ対応に携わったことがある者だけがIEに石を投げなさい

http://anond.hatelabo.jp/20170508211030

最初から追記(元増田がどういう環境でどういうソースから電子書籍を作ってるかわからないので、以下は自分のところの話)

新刊電子データなのだから電子書籍にするのも簡単だろとか言う方々はかつてのクロスブラウザ対応のことを考えてもらいたい。

HTML電子データなんだからIE6レイアウトが崩れないようにするなんて簡単だろ」って言ってんのと同じなんだよ。

InDesignEPUB書き出しは現状全く使えず、まともなEPUBを吐いてくれない。

となるとDTPの流し込み用テキストをもとに電子書籍データを作ることになる(そうじゃないところもあると思うが)。

もちろんInDesignから書き出したPDF電子書籍でございと売ればこの手間は省ける。

しかしリフローしない電子書籍文字を拡大するとページの一部しか読めなくなる電子書籍なんて読みたくないでしょ?

NHKテキストなんかはそれやってるけど。

印刷用のPDFデザイン簡素にして、Re:VIEWから直接出力できる程度の装飾しかしないなら話は簡単だ。

同じソースから紙の本向けのPDF電子書籍用のEPUBを同時に生成できる。

その場合でもIllustratorで作ったベクターデータの図を載せる場合PDF向けのEPSデータ(1色)とEPUB向けのPNGデータRGB)が必要だ。

そうなるとPDFEPUBで同じ場所にきちんと同じ図が掲載されているかのチェックが必須となる。

図に修正がかかった場合EPSPNGの両方を間違いなく修正たかチェックが必要

そんななので、紙のデータ電子書籍データをワンソースからサクッと作れる世界が来るまではもうちょっと時間がかかりそうなんだ。

2017-04-27

http://anond.hatelabo.jp/20170426151001

書き方が悪いのは認めるけど、頑張るのはレタッチだけじゃなくて、撮影時もだよ。撮影でいい絵が取らなきゃレタッチしようがないからね。

あと、あの単語フォトショップ連想するのはフォトショップ写真レタッチについてなんも知らない証拠

というか2.5万で「フォトショッパー」とやらに定義されるぐらい修整に時間なんてかけられないよ!ましてや奥さん!?

リバーサルかじった世代忌避反応起こしてるのか知らないけど、撮りっぱ至上主義には辟易カメラ内部で色いじってること知らんのかな?

あと本当の撮りっぱってRGB各色モノクロなんだけど、、、

というかフォトショッパーはフォトショッパーですげえから

http://anond.hatelabo.jp/20170427094504

RGBモニタ表示の参考にする加色混合(原色を混ぜれば混ぜるほど白に近づく)で

CMYK印刷表示の参考にする減色混合(原色を混ぜれば混ぜるほど黒に近づく)じゃないの?

表記が違うだけで色味そのものは変わらないはず

インキで表現できる色域がRGBより狭い。だからCMYK化すると多少色が変わるし、CMYK表現できない色はすっとぶ。

ただ、CMYK化したあとの色をきっちりとRGBモニタ表示することはできる。

http://anond.hatelabo.jp/20170427095306

そうなると、

いつもまた思うのが、

RGBのままレタッチしてCMYKに変換するのが正解なのか

RGBCMYKに変換してからレタッチするのが正解なのか

がどうしたらいいんだろうと思う。

これも、どっちでも結果は余り変わらないでOKなんだろうか?

基本はRGBレタッチ作業をする。

色の情報が削がれた後で色々調整すると、微妙色相を変たくても色が飛んでるから思うようにできなかったり、トージャンプしたり、あとはRGBじゃないと使えないフィルターなんかあるよ。

そして、だいたい終わった後でCMYK化して、微調整するのがいいよ。

ちなみに「表示」メニュー >「校正設定」の「カスタム...」からシミュレート対象に「Japan Color 2001 Coated」なんかを追加することで、データRGBのまま、「表示」>「校正設定」からCMYK変換後を予想して表示してくれる。

CMYK変換後の微調整でも校正設定は使える。

人物が写った写真を調整するとき、「表示」>「校正設定」>「作業マゼンタ版」で見てみる。このとき、顔がベタッと暗く塗りつぶされてると、思うように顔色が変わらないので、顔全体の中で濃度差ができるようにしてから調整するといい。

http://anond.hatelabo.jp/20170427094504

そうなると、

いつもまた思うのが、

RGBのままレタッチしてCMYKに変換するのが正解なのか

RGBCMYKに変換してからレタッチするのが正解なのか

がどうしたらいいんだろうと思う。

これも、どっちでも結果は余り変わらないでOKなんだろうか?

ログイン ユーザー登録
ようこそ ゲスト さん