質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

296閲覧

WinAPI マウスへのウィンドウの追尾

Weapon

総合スコア106

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/12/06 16:21

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ウィンドウプロシージャには物凄い数のメッセージが飛んできますので
その冒頭でなんらかの処理をするのはなるべく避けましょう

WM_MOUSEMOVEを用いて

c

1case WM_MOUSEMOVE: 2 if(wParam & MK_LBUTTON){ 3 position.x = GET_X_LPARAM(lParam); 4 position.y = GET_Y_LPARAM(lParam); 5 MoveWindow(chwnd, position.x + 5, position.y - 35, 300, 30, TRUE); 6 InvalidateRect(chwnd, NULL, TRUE); 7 } 8 break; 9case WM_LBUTTONUP: 10 downed = FALSE; 11 InvalidateRect(hwnd, NULL, TRUE); 12 MoveWindow(chwnd, 0, 0, 0, 0, TRUE);

c

1LRESULT CALLBACK ChildWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 2 switch (uMsg) { 3 case WM_CREATE: 4 5 break; 6 7 case WM_PAINT: 8 { 9 PAINTSTRUCT ps = {}; 10 wchar_t message[256]; 11 wsprintf(message, L"(x,y)=%6d,%6d", position.x, position.y); 12 13 HDC hdc = BeginPaint(hwnd, &ps); 14 DrawText(hdc, message, lstrlen(message), &ps.rcPaint, DT_CENTER | DT_SINGLELINE | DT_VCENTER); 15 EndPaint(hwnd, &ps); 16 } 17 break; 18 19 case WM_DESTROY: 20 break; 21 } 22 23 return DefWindowProc(hwnd, uMsg, wParam, lParam); 24}

投稿2018/12/06 22:56

編集2018/12/06 23:41
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2018/12/07 08:42

position.x = GET_X_LPARAM(lParam); position.y = GET_Y_LPARAM(lParam); は座標系の違いで上手くいかんかも だめだったら GetCursorPos(&position);に戻しといて
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問