当鼠标在窗口上移动时,窗口会收到
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
应该“将光标设置为箭头光标”,但是它似乎没有。那是为什么?
答案 0 :(得分:3)
请参阅hCursor
的{{1}}成员说明:
类游标的句柄。该成员必须是游标的句柄 资源。如果此成员为NULL,则必须显式设置应用程序 鼠标移动到应用程序时的光标形状 窗口。