如何更改按钮上的光标?

时间:2012-04-23 09:30:41

标签: c windows winapi user-interface button

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浏览器中的链接上时,它会变为手形?)

4 个答案:

答案 0 :(得分:3)

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

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。)

答案 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的按钮。