4
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);

这是行不通的。

那么如何在单击按钮后更改鼠标光标呢?另外,当鼠标悬停在按钮上时,如何更改鼠标的光标(就像悬停在网络浏览器中的链接上时它会变成一只手)?

4

4 回答 4

4

使用此代码更改单个控件的光标:

SetClassLong(btn, GCL_HCURSOR, (LONG)cursor);

对于 64 位兼容性,首选方法是:

SetClassLongPtr(btn, GCL_HCURSOR, (LONG_PTR)cursor);

请注意,这不会仅更改指定btn窗口的图标,但对于具有相同类的所有窗口,您必须先注册一个自定义类名称,RegisterClass()然后WNDCLASS.lpszClassName在创建时在结构中使用它btn

同样,这将适用于具有该(自定义)类的所有 Windows。要更改单个特定窗口的光标,您需要对其进行子类化,管理WM_SETCURSOR消息,如果(例如)lParamHTCLIENT(指针进入窗口客户区)然后调用SetCursor()以设置您想要的光标(不要忘记TRUE在此返回案子)。当然,这可能是暂时的(SetWindowLongPtr()使用调用GWLP_WNDPROC)。

于 2012-04-23T10:16:57.960 回答
3

您应该SetCursor()WM_SETCURSOR消息处理程序中使用。

于 2012-04-23T11:32:29.467 回答
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;
   // ...

它肯定会完成你的工作!

于 2013-03-11T12:36:28.667 回答
1

另外,当鼠标悬停在按钮上时,如何更改鼠标的光标(就像悬停在网络浏览器中的链接上时它会变成一只手)?

您可以对按钮进行超类化并创建具有手形图标的新按钮类。

在 BUTTON 类上使用 GetClassInfoEx,更改光标,给它一个新的类名,注册它并使用新的类名通过 CreateWindowEx 创建按钮。

于 2012-04-24T00:39:11.890 回答