マウスがウィンドウ上を移動すると、ウィンドウは
WM_SETCURSOR
メッセージを受け取ります (別のウィンドウがマウスをキャプチャしていない場合)。アプリケーションが に渡さ
WM_SETCURSOR
れた場合DefWindowProc
、DefWindowProc
関数は次のアルゴリズムを使用してカーソル イメージを設定します。
- ウィンドウに親がある場合は、
WM_SETCURSOR
メッセージを親に転送して処理します。- それ以外の場合、ウィンドウにクラス カーソルがある場合は、カーソルをクラス カーソルに設定します。
- クラスカーソルがない場合は、カーソルを矢印カーソルに設定します。
そして、ここに私のソースコードがあります:
#include <tchar.h>
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInsTance, LPTSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wcex = { 0 };
HWND hWnd;
BOOL ret;
MSG msg;
wcex.cbSize = sizeof(wcex);
wcex.lpfnWndProc = WndProc;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
// wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.lpszClassName = TEXT("MainWindow");
wcex.hIconSm = wcex.hIcon;
RegisterClassEx(&wcex);
hWnd = CreateWindow(wcex.lpszClassName, TEXT("Test"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while (ret = GetMessage(&msg, NULL, 0, 0))
{
if (ret == -1)
{
return EXIT_FAILURE;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(EXIT_SUCCESS);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
ウィンドウ上でカーソルをすばやく移動すると、カーソルが矢印に変化せず、サイズ変更の矢印になります。に設定すればwcex.hCursor
、LoadCursor(NULL, IDC_ARROW)
すべて問題ありません。私の質問は: MSDN が言うようにコードが機能しないのはなぜですか?
つまり、 を設定せず、メッセージをwcex.hCursor
処理しない場合、 「カーソルを矢印カーソルに設定する」必要がありますが、そうではないようです。何故ですか?WM_SETCURSOR
DefWindowProc