はてなキーワード: RGBとは
// 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(&amp;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(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;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, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48*9,48 * 100 }; InvalidateRect(hWnd, &amp;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, &amp;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, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;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, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;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, &amp;Rect, hBrush); //Rect.left += width; //Rect.right += width; Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;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 &amp;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, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;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; }
テトリス風
落ちてくるブロックの描き方
まずはブロックの種類は3種類
の違いをよく見比べて
自力で違いがわかれば
プログラマーにはなれるとおもう
とはいえ、コレを自力でわかるならもっと儲かる仕事あるとはおもうけどな
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(&amp;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(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;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, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48*9,48 * 8 }; InvalidateRect(hWnd, &amp;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, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;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, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;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, &amp;Rect, hBrush); //Rect.left += width; //Rect.right += width; Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;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, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;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; }
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, &amp;Rect, hBrush); //Rect.left += width; //Rect.right += width; Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;ps) { if (x > 8) { x = 0; } if (x <0) { x = 8; } if (y > 8) { y = 0; } this->WriteBox(); return TRUE; }
第何回だろうな
まだ、何を押してもブロックが右に移動するだけ(右端にいくと左にワープ)
// 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(&amp;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(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;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, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48*9,48 * 8 }; InvalidateRect(hWnd, &amp;Rect2, TRUE); } else if (obj == WAIT_FAILED) { rc = GetLastError(); } else { } } return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;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, &amp;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, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;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; }
描画部分の違い
変数 y をつかって
高さが8までで移動するように
yが変わると■のいちも変わるから
タイマーで呼び出されるたbに
下へ 下へと作画される
BOOL OnPaint(PAINTSTRUCT &amp;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, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; }
// 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(&amp;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(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;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, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48,48 * 8 }; InvalidateRect(hWnd, &amp;Rect2, TRUE); } else if (obj == WAIT_FAILED) { rc = GetLastError(); } else { } } return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;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, &amp;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, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;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; }
ソース全部だと長いけど ようするに
違いはこの部分
CreateSolidBrush が 色を決めている
Rect で位置と大きさを
FillRectで書いている
BOOL OnPaint(PAINTSTRUCT &amp;amp;ps) { HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); RECT Rect = { 0,0,48,48 }; BOOL ret = FillRect(ps.hdc, &amp;amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; }
青い■を表示するだけ
// 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(&amp;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(&amp;msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;msg); } } return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;ps) { HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); RECT Rect = { 0,0,48,48 }; BOOL ret = FillRect(ps.hdc, &amp;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, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;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; }
ウイルスチェックはマカフィーで裏で動くと処理が重たくなり、メール主体でOutlookを使い、ファイルのシェアはSharePoint。
会議室探すのも表示が遅くて20秒ほど待たないといけないし、そもそもない。
毎日パワポで資料を作るが、文字だけで説明しても理解してもらえないので、パワポ上で絵をカキカキする毎日。
社内の人数は多いがアクセスできる情報が限られており、基本自分が参加したことのあるプロジェクトの情報しか手に入らず、社外へプレスリリースされて初めて自社のことを知る。
メールは基本読んでも返事はなく、会議を開かないと何も進まないが、事前に意見を返信してもらえればいいが、こういう場合はどうするのか検討しているのか、Pros Consはどうなのかと質問され、
Pros Consの数案に対してスケジュールを複数作り、調整している間に状況が代わりリスケ。
誰もが効率悪いと感じてるのだが、誰もが専門家ではあるのだが、会社の仕組みに対してのプロではないことと、
本やネットで話題になっていることは、前提に色々システムがある前提で、自社に対しては役に立たない…。
新しい仕組みに対してどれだけ効果があるのか数値化しないといけないため、パソコンのスペックは更新のたびに悪くなるのだが、
経費削減で利益に貢献できているようなのだが、会議室のRGBケーブルしか対応していない古いプロジェクタに接続できなかったりする。
「働き方改革≒リモート」と一部の企業利益になるもの以外に、仕組みが必要なのだがメディアも取り上げなければ、展示会もない。
https://anond.hatelabo.jp/20180112100435
これだけ見るとすごく暗いしコントラストが小さいよね。
ただ、暗い部屋での人の目の順応性のことを思うと、わりとホワイトバランスをうまく調整してくれてそれなりに見えるんじゃないかとも思う。
ところが元の増田も、また、その増田のブコメでいくつか言及されていた色覚異常者が色彩に出会って感動する動画も、それらのリアクションは全て未知の色彩と出会う驚きによって演出されています。
これは同感。そこまで未知の色彩があるわけない。それもたかがフィルター通しただけで。
ただ、自然界がすべての光の波長のパターンを網羅しているわけでもないと思うので、より色鮮やかに見えるパターンというのはあり得るかもしれないと思う。
実際自分の場合、紅葉や赤いバラは肉眼で見ても暗い赤にしか見えないが写真やテレビで見るとものすごく鮮やかな赤に見える。
これらを組み合わせて、この製品が嘘だという最大の根拠を一つ示します。
特定の色の彩度を下げることで鮮やかな世界を作れるとするのであれば、どうして症例にあわせた作例が一つもないのでしょうか。
レタッチソフトを使えばRGBのバランスを変えることは造作も無いことです。
この辺は微妙。
そもそもこの世に存在するRGBやらCMYKというのは色覚正常者にとって最適化されたものなので、色覚異常者にとってはそもそもがずれたものだ。
光というのは本来様々な波長を含むもので、全く同じ色に見えるものでも物質が違えば違う波長の光を含んでいる。
そういう性質を利用して色覚正常者だけが、自然光と同じに見えるようなRGBの三色光とCMYKのインクを選んでいるにすぎない。
とても繊細な調整が必要で、モニターによって色は変わるし、インクのロットが違えば色も微妙に変わる。再現度を高めるために色校正が必要とされる理由である。
モニターや印刷物は1つ1つで発色の加減が微妙に違うのに、色覚正常者はだいたい同じように見えるように調整している。
言い方を変えると、本当は違う色(光)が出てるのに色覚正常者はその違いを認識できない。
これはあくまで色覚正常者向けの調整なので、極端に言うと色覚異常者にはどれも違うように見えてしまう。
だから、作例がないというのは仕方のない話で、やろうと思っても画像ファイルだけを用意すればいいというものではないのだ。
専用のモニターを用意してそのモニターだけで見るようにすればできるかもしれない。
印刷物の場合、指定のインクを使ってきっちり色校正するようにすればできるかもしれない。
(これを実際にやっているのが色覚検査表。あれって自分で買うとものすごく高いのだけどそれだけ手間はかかってる。
http://www.neo-dalton.com/side/check/が簡易的と言っているのもそのため。これは専用のモニターを使ってるはず。)
これまでの自分の実感だと赤緑色弱は本当に個人によって見え方が全然違う。
この増田自身は赤緑色盲(2色型色覚)なのではないかと思うが、赤緑色盲向けの作例であれば可能ではないかと思う。
ただそれをやるのは結構お金がかかると思うよ。レタッチで済むというものではないだろうから。
分かる。
でも彼らには見えてないものが僕らには見えているはずでそっちを楽しんで生きていきたい。
自分はもともと先天赤緑色覚異常だったのに加えて20代でスティーブンス・ジョンソン症候群(wikiは閲覧注意かも)に罹って後遺症?で眼に影響がでたっていう変な状況。
以下、困った思い出とか
1.幼少期のお絵描。クレヨンに色名を書いた紙がないと赤、茶、緑とかの区別がつかない。
だから蓋の裏に色名が書いてあったクーピーはしまう順番間違えると大変。
2.信号。場所で覚えた。色自体の区別はついてない。運転免許は持っていないので特に不便はない。
3.パズルゲーム。ぷよぷよはぎりぎり形で判別できたけど、ときメモのぱずるだまは出来なかった。パズドラの補正はちょっと嬉しかった。
5.小学生時、紅葉を見て「綺麗だね」と言った母に「よくわからないんだ」と返してしまったこと。
このことがきっかけで色覚検査をうけたような覚えがある。検査後母に謝られたのはなんか今でも良く覚えてる。
誰も悪くないのに難しい。
6.家電、電子機器のお知らせランプ。「正常時は緑、エラーのときは赤」みたいなの。
大きいと周りとの差で何となく分かることもあるけど小さいとどっちにしろ光ってるだけの代物
7.UNO。有名。去年だっけ、色覚異常者向けのが出来たのって。
8.焼肉。有名。焦げ始めないとわかんない。
9.黒板に色付きチョーク。白、黄、青のチョーク以外は何書いてあるかわからないこともあった。
10.黄色系の色が目に刺激が強すぎて眼鏡のレンズに色を入れるようになった。色覚補正レンズではないただ色の入ったレンズだけど。
11.体調次第で明るさに凄い補正がかかる時がある。晴れてる昼間なのに薄暗かったり。大体夕日が完全に沈んじゃったくらいの暗さかな。
今までの対応は場所とか他の要素で判別できるものがあるときはそれを機械的に覚えちゃう。
色でしか区別がつかない時は周りに頼るか、諦める。なので事前に周囲にわかってもらってると楽。
生活の中では単品で何色か判断することよりも何かと比べて何色だって判別することのほうが多いような気がするし。
なので色以外で判別できるように形だったり文字入れたりとかして欲しいものは結構ある。
PCをいじり始めてRGBって概念知ってからは色々判別は楽になったな。数値化できるって素晴らしい。
お陰で初音ミクの髪の色が随分緑がかってるんだなってわかりました。
色覚異常者です。
もう手遅れかもしれませんが、本当に本当に辛い思いをしている人間を、さらにその希望まで踏みにじるようなことは止めてください。
残念ながらこの製品はフェイクであり、この体験記もフェイクです。
それがフェイクであることは、このサイトの中で簡単に証明できます。
http://www.neo-dalton.com/side/check/
色覚異常者であるわたしは、一般とされている画像が52と読めます。
(健常者に確認を取ったわけではありませんが、ここにはおそらく89と書かれているのではないでしょうか。)
そして画像の番号が進むと同時に89という文字が視認できるようになります。
わたしはA7で視認できました。
お気づきでしょうか。
89は確かに読めました。でも、これが色覚異常者が見たいと願う色の世界でしょうか。
52と読めてしまう背景には、健常者であれば区別できる色の違いが色覚異常者には区別できないことに原因があります。
健常者であれば区別できる数色が、色覚異常者には緑のような茶色のような灰色のようなどれとでも取れるような色に見えているのです。
それを色覚異常者でも色の区別ができるようにするには、こうして世界全体の色を替える以外に手段はありません。
つまり、この画像が色覚矯正メガネをかけて見える世界ということです。
世界から緑をなくせば紫に転ぶし、赤をなくせばシアンに転びます。DTPをやったことある人間ならすぐにピンとくる話だと思います。
確かに青ははじめよりも青く感じるので一概に元の増田が嘘とはいえませんね。
色覚異常とは、ある特定の色に対してそれ以上の彩度を感じられない症状のことをいいます。
つまり、どれだけ色のバランスを整えたとしても、今まで感じたことのなかった彩度以上の色彩を感じることはありえません。
ところが元の増田も、また、その増田のブコメでいくつか言及されていた色覚異常者が色彩に出会って感動する動画も、それらのリアクションは全て未知の色彩と出会う驚きによって演出されています。
おかしいですよね。今以上の彩度を感じられる器官を持たないのに、メガネをかけると見えるだなんて。
つまりそれらは矛盾であり、感動ポルノを作り出すための演出であることがわかります。
これらを組み合わせて、この製品が嘘だという最大の根拠を一つ示します。
特定の色の彩度を下げることで鮮やかな世界を作れるとするのであれば、どうして症例にあわせた作例が一つもないのでしょうか。
レタッチソフトを使えばRGBのバランスを変えることは造作も無いことです。
それぞれの色覚異常の症例にあわせて、その人がメガネを掛けることで見える世界を簡単に再現できるはずです。
それが出来ないのだから、残念ながらこの製品がフェイクであると言わざるを得ません。本当に残念です。
もしこれが配色を変えることで色の境界をわかりやすくする程度の製品であれば疑いません。
しかし、今以上に鮮やかに見えると謳うのであれば、それは詐欺でしかいいようがありません。
色覚異常に同情し、それが解決できた気持ちを喜んでくれることは本当にありがたいことです。
だから、元の増田にブコメが沢山ついたことも、あの動画に沢山の感動が寄せられたこともとても好意的に思っています。
しかし、残念ながらその行動が、詐欺を助長してしまう結果になっていることは本当に遺憾です。
始めの頃は肌色が再現できずに相当悩みましたが、いまではあえて特定色の彩度を下げることで自分にしか見えていない世界を写真として表現するようになりました。
その独特の色彩感覚が人には面白いらしく、むしろ被写体の色が湧き上がってくるような写真だと周囲からもとても好評です。
(誤解のないように付け加えますが、この写真は意識しないと気づかない程度に被写体以外の彩度を失わせるという演出です。こちらでいうようなすべての色が色彩を増すわけではありません。)
自分が色覚異常者として生活を続けることでたどり着いた結論は、「失うことは得ることと同意」ということでした。
普段人ができないような何かを失う経験そのものが、かえがたき貴重な経験として得られるものだからです。
それならばないことを嘆くより、得られたものを喜べたほうがよいですよね。
そういう様に考えるようになってからは、自分が人よりも劣った存在だとは感じないようになりました。
これは同じ問題に悩む人間全員に一番に伝えたい事でもあります。
そうはいっても例えば紅葉が綺麗だと言われる度に、他の人が見えている世界を見たいと願う自分がいます。
だからこういう製品や記事が流れる度に、どこかに期待してしまう自分が否めません。
もしこれが詐欺だったときに涙をながすかもしれない人を想像してもらえるなら、ほんの少しだけその感動を安直にシェアするべきか踏みとどまって頂けたら幸いです。
私は先天性の色覚異常である(wiki先生によると色覚多様性という言い方もあるらしい)。
もっとも、「最後の赤と緑、赤い方を切れ!そうすれば爆発を回避できる!」……みたいな経験もないので、仕事や日常生活にはさほど困ってはいない。
ただ、興味本位と日常の些細な問題(靴下の色を取り違える、焼けてない肉を食べそうになる etc.)から、先日、色覚補正用レンズを購入した。
色覚異常を持つ人は男性で約5%の割合でいるそうだ。強弱はともあれ、佐藤・鈴木・高橋姓を足した人数くらい、先天的にその特性を持っているはずである。
まぁ、日常生活で気付くことはまず無理だし、赤の他人から指摘するのも(たぶん)躊躇われるし、で同様に困ってる人にはまだリアルで遭遇していない。
自身の場合は母方祖父がそうだったため、家族からの指摘で比較的早い段階で気付くことが出来た。
早い段階で気付けたことと、見分けのつきにくい色もバンバン他人に聞くことができるので、生活のしづらさはない。
ユニバーサルデザインというのもだいぶ浸透していて、色だけで何かを区別しなければ行けない状況もほぼない。
職業により多少の制限はあるものの、この制限自体は絶対的に必要だと思うから、あとは世間の理解さえ追いついてもらえれば楽かなぁと思う。
ただ、世間に対して偉そうに言ったものの、自分自身もよくわかっていない。
色認識のズレがどの程度のあるかなどは、結局は自身の経験則でしか語れず、
しかもその経験則でさえ「この色とこの色は見分けづらい」と言うと、一般人でも見分けづらいと言われてしまうこともあり、いまいち説明しづらい。
webにも幾つか判定ツールが転がっているが、画面の発色とかの環境依存によるところもあると思っていて、あまりあてにしていない。
ということで、自身の色覚異常の検査とともに、結果次第では補正用レンズの購入をしようかなと思った次第である。
お世話になったのはここ↓(というかそういうレンズをちゃんとした所から買うなら、現状ここ一択にならざるをえないと思う)
聞いたこともない会社に電話するのも勇気がいったのだが、思っていた以上にあっさり予約できた。
予約の際に年齢・職業も聞かれて、ちょっと怪しいなぁ……とその時は思ってしまったが、
検査で低年齢の人には遺伝の話は嫌がられるからしないだとか、職によっては制限があるとかの理由を聞けて一安心。
一日の対応件数も限られているらしいので、あっさり予約できたのはラッキーだったとのこと。
検査を終えて、自分はここ(http://www.neo-dalton.com/side/check/)でいうA7(中程度)だった。
強い異常でもなければ弱い異常でもないとのこと。
そのままレンズ購入を勧められ、まぁ何だかんだで買ってしまった……。
補正レンズで幾つかの風景や静物の写真を見たが、少し色が鮮明になったかなくらいの認識で、正直、財布から失われたレンズ代(70,000円)の衝撃の方が大きかった。
私は近眼用のメガネを常用しているので、そこの近所のメガネ店で売っている跳ね上げ式のメガネフレームとかも紹介されたが、
流石にこれはないだろう……と思って、フレームは自分で探すことにした。
フレーム探しは思っていた以上に大変だった。
受取のことも考えて、まずはHPにも載ってるレンズで業務提携している大手のメガネ屋さんを当たってみた。
「これくらいしかありません」と、定員さんに言われて見せられたのが、
種類は金属フレームのみでそこそこのお値段、出来上がりも10日程と、非常に考えさせられるような内容だった。
(ここまで不遇なのか……)
その後、色々お店を回った結果、普段からお世話になっているお店の別店舗で何とかフレームを見つけ、1時間程度で仕上げてもらった。
これも運が良かったと思う。メガネフレームの流行り廃り次第では、ジジババがかけているようなメガネしか見つからないかもしれない。
出来上がったメガネを装着し、周囲を見渡したが、それほど変化もなく、こんなもんかと思った。
(まぁ、せっかく買ったし、これを付けて外に出てみるか……)
(ん……!!)
(空が青い)
(深みが増したというか分かんないけど、明らかに青い!)
補正レンズの原理の詳細はここ(http://www.neo-dalton.com/genri/)に記されているが、要はRGB(赤緑青)のバランスを矯正するためのレンズで、
自分の場合は緑の感度を大幅に弱め、青の感度を少し弱めることでバランスをとっている。
ということは、今まで大して緑っぽく見えてなかった色や青っぽく見えていなかった色が突然鮮明な緑や青として見えるようになった、みたいな話らしい。
Chromeのアイコンの中央の青と左下の緑がくっきり見えるし、LINEのアイコンもあんなに緑々しい色をしているとは夢にも思わなかった。
当初は赤緑の区別ができれば、まぁいいかなくらいに思っていた補正レンズだったが、まさかこういう派生効果が生じるとは。
押し切られて買ってしまったときは、流石にどうなることかと思ったけれど、いい買い物をしたなぁと思った。
同時に、世間一般にありふれてる配色の妙を少しでも感じ取ることが出来てよかったなぁと思う。
企業のロゴ、街中の看板、周りの人の服装、……多くのことで、実はこんな色だったんだな、こっちの配色の方がしっくりくるなと感じる。
デザインの仕事してるとクライアントから「この写真を表紙に使ってよ」という話はよくあるんだけど、だいたいそういう写真って使いにくい。
まずフレームいっぱいに対象物が収まってるパターン。文字を置くスペースがないし、トンボの断ち切りの余白もないから怖い。
次に対象物が歪んでるパターン。近くによらず、ズームで近づけて欲しいんだけど何故かみんな近くに寄って撮りたがる。結果歪む。
ピンボケや逆光で景色がよくわからないパターン。それホントにいい写真だと思ってるのかな。
解像度の不足してるパターン。スマホで撮った写真やインスタ写真をそのまま転送。荒い写真にしかならなくて致命的。あとネットで拾ってきた写真とか。
RGB感の強い写真のパターン。CMYKになっちゃうので綺麗に抜けた青空とか蛍光色っぽいのとか難しい。
シャープのブラウン管使ってる。先月Xbox360買って中古テレビ探しに行ったら見た瞬間に即決した。
カッコイイ、マジで。そして速い。アイマスを見ると遅延無い。マジで。ちょっと 感動。
しかもブラウン管なのにD3ついてるから画質も綺麗でよい。D3はプログレッシブスキャンが無いと言われてるけど個人的には綺麗と思う。
HDMIと比べれば、そりゃちょっとは違うかもしれないけど、そんなに大差はないって店員も言ってたし、それは間違いないと思う。
ただ、文字が細かいとちょっと辛いね※1。D端子なのにちょっとぼやけてるし。
フレームレートに関しては多分D3もHDMIも変わらないでしょ。HDMI見たこと無いから知らないけど、デジタル端子があるかないかでそんなに変わったらアホ臭くてだれもD3なんてかわないでしょ。個人的にはD3でも十分に綺麗。
嘘かと思われるかもしれないけど大阪堺のドンキホーテでジェネリックレグザを抜...くのは無理だと思ったので、買い替えた。つまり、その足でエディオンへ行き処分をお願いした※2という訳で、それだけでも個人的には大満足です※3.
※1 A列車の文字の細かさと言ったら泣ける。あれはアナログRGBかD4じゃないと無理。当時はHDMIな箱〇持ってなかった。
※2 お店で申し込み時。「この時間帯なら引き取りに伺う配送係の空きがあります」という感じの、宅配便に近い時間指定方法。15分くらいで受付終了。平日6~9時おすすめ。本人が自宅にいれば、サイン一つで引き取り。リサイクル関係の書類は向こうが書いてくれる。
※3 堺市に本社のあるシャープ16インチ以上ブラウン管の場合、5076円(税込)。リサイクル料金2916円+引き取り料2160円。店で買い物しなくても、引き取りだけでもOK.ヤマダ、ケーズ、ドンキホーテと比較して、一番安い。しかも店員レベル高いという事で大満足。
補足。
32インチのブラウン管の重さは約50kg。怪力でも腰を痛める可能性があるので、必ず2人以上で運搬しましょう。引き取り当日は、若い男性配送員2人で運んでました。
Webサイトのクロスブラウザ対応に携わったことがある者だけがIEに石を投げなさい
http://anond.hatelabo.jp/20170508211030
最初から追記(元増田がどういう環境でどういうソースから電子書籍を作ってるかわからないので、以下は自分のところの話)
新刊は電子データなのだから電子書籍にするのも簡単だろとか言う方々はかつてのクロスブラウザ対応のことを考えてもらいたい。
「HTMLは電子データなんだからIE6でレイアウトが崩れないようにするなんて簡単だろ」って言ってんのと同じなんだよ。
InDesignのEPUB書き出しは現状全く使えず、まともなEPUBを吐いてくれない。
となるとDTPの流し込み用テキストをもとに電子書籍データを作ることになる(そうじゃないところもあると思うが)。
もちろんInDesignから書き出したPDFを電子書籍でございと売ればこの手間は省ける。
しかしリフローしない電子書籍、文字を拡大するとページの一部しか読めなくなる電子書籍なんて読みたくないでしょ?
印刷用のPDFはデザインを簡素にして、Re:VIEWから直接出力できる程度の装飾しかしないなら話は簡単だ。
同じソースから紙の本向けのPDFと電子書籍用のEPUBを同時に生成できる。
その場合でもIllustratorで作ったベクターデータの図を載せる場合、PDF向けのEPSデータ(1色)とEPUB向けのPNGデータ(RGB)が必要だ。
そうなるとPDFとEPUBで同じ場所にきちんと同じ図が掲載されているかのチェックが必須となる。
図に修正がかかった場合、EPSとPNGの両方を間違いなく修正したかチェックが必要。
そんななので、紙のデータと電子書籍のデータをワンソースからサクッと作れる世界が来るまではもうちょっと時間がかかりそうなんだ。
書き方が悪いのは認めるけど、頑張るのはレタッチだけじゃなくて、撮影時もだよ。撮影でいい絵が取らなきゃレタッチしようがないからね。
あと、あの単語でフォトショップを連想するのはフォトショップや写真のレタッチについてなんも知らない証拠。
というか2.5万で「フォトショッパー」とやらに定義されるぐらい修整に時間なんてかけられないよ!ましてや奥さん!?
リバーサルかじった世代が忌避反応起こしてるのか知らないけど、撮りっぱ至上主義には辟易。カメラ内部で色いじってること知らんのかな?
http://anond.hatelabo.jp/20170427094504
RGBはモニタ表示の参考にする加色混合(原色を混ぜれば混ぜるほど白に近づく)で
インキで表現できる色域がRGBより狭い。だからCMYK化すると多少色が変わるし、CMYKで表現できない色はすっとぶ。
ただ、CMYK化したあとの色をきっちりとRGBモニタ表示することはできる。
http://anond.hatelabo.jp/20170427095306
そうなると、
いつもまた思うのが、
がどうしたらいいんだろうと思う。
これも、どっちでも結果は余り変わらないでOKなんだろうか?
色の情報が削がれた後で色々調整すると、微妙に色相を変たくても色が飛んでるから思うようにできなかったり、トーンジャンプしたり、あとはRGBじゃないと使えないフィルターなんかあるよ。
そして、だいたい終わった後でCMYK化して、微調整するのがいいよ。
ちなみに「表示」メニュー >「校正設定」の「カスタム...」からシミュレート対象に「Japan Color 2001 Coated」なんかを追加することで、データはRGBのまま、「表示」>「校正設定」からCMYK変換後を予想して表示してくれる。
人物が写った写真を調整するとき、「表示」>「校正設定」>「作業用マゼンタ版」で見てみる。このとき、顔がベタッと暗く塗りつぶされてると、思うように顔色が変わらないので、顔全体の中で濃度差ができるようにしてから調整するといい。