2012-04-23 120 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; 
    // ... 

它會做你的工作肯定!