2012-04-23 124 views
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); 

这是行不通的。

那么点击按钮后如何更改鼠标光标?另外,如何在鼠标悬停在按钮上时更改鼠标光标(例如,当鼠标悬停在网页浏览器中的链接上时,它会变成手形)?

回答

3

使用此代码改变单一控制的光标:

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

优选方法中,对64位的相容性,是:

SetWindowLongPtr(btn, GCL_HCURSOR, (LONG_PTR)cursor); 
+2

谢谢。但根据MSDN的说法,使用'SetClassLongPtr'代替它不是更好吗? – ApprenticeHacker 2012-04-23 10:41:42

+0

@IntermediateHacker是的,方便与64位兼容。 – 2012-04-23 11:25:42

+1

呃,不管发生了什么[不使用全局范围来解决本地问题](http://blogs.msdn.com/b/oldnewthing/archive/2008/12/11/9193695.aspx)? 'SetClassLong'将改变从同一个类创建的EVERY控件的游标(在我认为的相同过程中)。 – Deanna 2012-04-23 11:30:42

1

而且,我如何改变鼠标的光标,因为它悬停在 按钮(如它 网络浏览器悬停在链接时变为手)?

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

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

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; 
    // ... 

它会做你的工作肯定!