作爲MSDN describes:爲什麼窗口沒有正確設置光標?
當在窗口鼠標移動時,窗口收到消息
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
應該「將光標設置爲箭頭光標」,但它似乎沒有。這是爲什麼?
我的攝製。那篇文章是錯誤的,按照WM_SETCURSOR的文檔告訴你。 –