前提・実現したいこと
WinAPI ポップアップするテキスト等のデザインから実際にIllustratorのように左クリックをしている間ウィンドウを追尾表示させるコードを書いたつもりですが
数字が変化させれず,長い間動かしているとヌルヌルします.
1)そもそもキーダウンしている間の連続的な処理をプロシージャで実装させる方法,記述方法をあまり知りません.どのような処理がボトルネックにならない一般的な方法なのでしょう?
2)別のスレッドに処理を投げるなら子ウィンドウのプロシージャごと投げるべきでしょうか?それとも座標位置の文字列の値の書き換えだけを投げるべきでしょうか.
該当のソースコード
C
1#ifndef UNICODE 2#define UNICODE 3#endif UNICODE 4 5#include <windows.h> 6 7LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM); 8LRESULT CALLBACK ChildWindowProc(HWND, UINT, WPARAM, LPARAM); 9 10HINSTANCE hInst; 11//static POINT downpos, uppos; 12static POINT position; 13BOOL downed; 14 15const wchar_t CLASS_NAME[] = L"CLASS"; 16const wchar_t CHILD_CLASS_NAME[] = L"CHILD CLASS"; 17 18int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR nCmdLine, int nCmdShow) { 19 UNREFERENCED_PARAMETER(hPrevInstance); 20 UNREFERENCED_PARAMETER(nCmdLine); 21 22 hInst = hInstance; 23 24 WNDCLASSEX wc = { 25 sizeof(WNDCLASSEX),CS_VREDRAW | CS_HREDRAW, WindowProc, 26 0, 0, hInstance, 27 NULL, (HCURSOR)LoadCursor(NULL, IDC_ARROW),(HBRUSH)GetStockObject(WHITE_BRUSH), 28 NULL, CLASS_NAME, NULL 29 }; 30 31 RegisterClassEx(&wc); 32 33 HWND hwnd = CreateWindowEx( 34 0, CLASS_NAME, L"Template", WS_OVERLAPPEDWINDOW, 35 50, 50, 960, 525, 36 NULL, NULL, hInstance, NULL 37 ); 38 39 ShowWindow(hwnd, nCmdShow); 40 UpdateWindow(hwnd); 41 42 MSG msg = {}; 43 44 while (GetMessage(&msg, NULL, 0, 0)) { 45 TranslateMessage(&msg); 46 DispatchMessage(&msg); 47 } 48 49 return (int)msg.wParam; 50} 51 52LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 53 GetCursorPos(&position); 54 static RECT rc; 55 static HWND chwnd; 56 57 if (downed == TRUE) { 58 MoveWindow(chwnd, position.x + 5, position.y - 35, 300, 30, TRUE); 59 } 60 else { 61 MoveWindow(chwnd, 0, 0, 0, 0, TRUE); 62 } 63 switch (uMsg) { 64 case WM_CREATE: 65 { 66 WNDCLASSEX wc = { 67 sizeof(WNDCLASSEX),CS_VREDRAW | CS_HREDRAW, ChildWindowProc, 68 0, 0, hInst, 69 NULL, (HCURSOR)LoadCursor(NULL, IDC_ARROW),(HBRUSH)GetStockObject(WHITE_BRUSH), 70 NULL, CHILD_CLASS_NAME, NULL 71 }; 72 RegisterClassEx(&wc); 73 chwnd = CreateWindowEx( 74 0, CHILD_CLASS_NAME, L"Template", WS_OVERLAPPED | WS_POPUPWINDOW, 75 0, 0, 0, 0, 76 hwnd, NULL, hInst, NULL 77 ); 78 79 ShowWindow(chwnd, SW_SHOW); 80 UpdateWindow(chwnd); 81 } 82 break; 83 84 case WM_LBUTTONDOWN: 85 downed = TRUE; 86 GetCursorPos(&downpos); 87 //ScreenToClient(hwnd, &downpos); 88 InvalidateRect(hwnd, NULL, TRUE); 89 90 break; 91 92 case WM_LBUTTONUP: 93 downed = FALSE; 94 //GetCursorPos(&uppos); 95 InvalidateRect(hwnd, NULL, TRUE); 96 97 break; 98 99 case WM_PAINT: 100 break; 101 102 case WM_DESTROY: 103 PostQuitMessage(0); 104 return 0; 105 } 106 107 return DefWindowProc(hwnd, uMsg, wParam, lParam); 108} 109 110LRESULT CALLBACK ChildWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 111 PAINTSTRUCT ps = {}; 112 HDC hdc = GetDC(hwnd); 113 wchar_t message[256]; 114 wsprintf(message, L"(x,y)=%6d,%6d", position.x, position.y); 115 116 BeginPaint(hwnd, &ps); 117 DrawText(hdc, message, lstrlen(message), &ps.rcPaint, DT_CENTER | DT_SINGLELINE | DT_VCENTER); 118 EndPaint(hwnd, &ps); 119 switch (uMsg) { 120 case WM_CREATE: 121 122 break; 123 124 case WM_PAINT: 125 { 126 127 } 128 break; 129 130 case WM_DESTROY: 131 break; 132 } 133 134 return DefWindowProc(hwnd, uMsg, wParam, lParam); 135}
補足情報
Windows10 Pro
VisualStudio2017 Community
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/07 08:42