static HWND btn;
HCURSOR cursor = LoadCursor(0, IDC_CROSS);
case WM_CREATE:
btn = CreateWindow(TEXT("BUTTON"), TEXT("Press Me"),
WS_CHILD|WS_VISIBLE, 50, 50, 80, 30,
hwnd, (HMENU) 111, NULL, NULL);
现在,在WM_COMMAND
中,我尝试使用:
SendMessage(btn, WM_SETCURSOR, 0, (LPARAM) cursor);
哪个不起作用。
那么如何在点击按钮后更改鼠标光标?另外,当鼠标悬停在按钮上时,如何更改鼠标的光标(当它悬停在Web浏览器中的链接上时,它会变为手形?)
答案 0 :(得分:3)
使用此代码更改单个控件的光标:
SetClassLong(btn, GCL_HCURSOR, (LONG)cursor);
对于64位兼容性,首选方法是:
SetClassLongPtr(btn, GCL_HCURSOR, (LONG_PTR)cursor);
请注意,这不会仅更改指定btn
窗口的图标,但对于具有相同类的所有窗口,您必须先使用RegisterClass()
注册自定义类名,然后再使用它创建WNDCLASS.lpszClassName
时在btn
结构中。
同样,这将适用于具有该(自定义)类的所有Windows。要更改单个特定窗口的光标,您需要将其子类化,管理WM_SETCURSOR
消息,如果(例如)lParam
是HTCLIENT
(指针进入窗口客户区),则调用SetCursor()
设置所需的光标(在这种情况下不要忘记返回TRUE
)。当然,这可能是暂时的(使用SetWindowLongPtr()
调用GWLP_WNDPROC
。)
答案 1 :(得分:3)
答案 2 :(得分:2)
LRESULT CALLBACK DlgProc (HWND hWndDlg, UINT message, WPARAM wParam, LPARAM lParam) {
static RECT rcButton;
static HWND hButton;
static HCURSOR hCursor;
// ...
switch (message) {
case WM_INITDIALOG:
hButton = GetDlgItem (hWndDlg, IDC_BUTTON);
GetClientRect (hButton, &rcButton);
MapWindowPoints (hButton, hWndDlg, (LPPOINT) &rcButton, 2);
break;
case WM_MOUSEMOVE:
if ((LOWORD (lParam) >= rcButton.left - 1 && LOWORD (lParam) <= rcButton.right) && (HIWORD (lParam) >= rcButton.Top - 1 && (HIWORD (lParam) <= rcButton.bottom))
SetClassLong (hButton, GCL_HCURSOR, (LONG) LoadCursor (NULL, IDC_CROSS));
else
SetClassLong (hButton, GCL_HCURSOR, (LONG) LoadCursor (NULL, IDC_ARROW));
break;
// ...
它肯定会完成您的工作!
答案 3 :(得分:1)
另外,如何在鼠标悬停时更改鼠标光标 按钮(当它悬停在链接上时,它会变成一只手 网络浏览器)?
您可以超级按钮并创建一个具有手形图标的新类按钮。
在BUTTON类上使用GetClassInfoEx,更改光标,给它一个新的类名,注册它并使用新的类名来创建带有CreateWindowEx的按钮。