1. 程式人生 > >MFC改變滑鼠指標

MFC改變滑鼠指標

Windows程式和Doc程式很大的不同 , 就在於Windows有一個亮麗的圖形介面和簡捷的操作方式 , 而滑鼠就是Windows程式中最重要的一個操作手段 .       有朋友向我諮詢如何修改滑鼠形狀 , 這本來是一個簡單的問題 ,但是當朋友向我詢問進一步的,更加深入的操作機制時 ,我才發現裡面隱藏著更多的問題 , 回到家裡研究了一下 ,得到一些結論 。 這裡就Windows下滑鼠形狀的一些修改方法 , 以及一些相關API的使用 , 談談自己的總結 ,希望對初學者能夠有所幫助 。   作業系統:        Windows2000 . 開發環境:         Visual C 6.0   ,   MFC . 示例相關類:      文件檢視結構 , CDocTestView . 1: 修改方法一  過載CView裡的OnMouseMove函式 .     過載方法 :         “View” -> “ClassWizard” (Ctrl + W) -> 右側Messages欄選擇”WM_MOUSEMOVE” , 然後點”Add Function” , 點”OK” .     新增程式碼 :      在 CDocTestView::OnMouseMove()裡新增如下程式碼:                    HCURSOR hCur  =  LoadCursor( NULL  , IDC_CROSS ) ;                 ::SetCursor(hCur);     機制分析:            系統預設每次呼叫OnMouseMove函式 ,都會重新用程式預設自帶的游標來重新繪製游標 ,所以 ,需要在OnMouseMove裡來進行游標的修改才有效 。 2: 修改方法二       過載CView裡的OnSetCursor函式 .       過載方法:        “View” -> “ClassWizard” (Ctrl + W) -> 右側Messages欄選擇”WM_SETCURSOR” , 然後點”Add Function” , 點”OK” .       新增程式碼 :            修改OnSetCursor 為如下程式碼:            BOOL CDocTestView:: OnSetCursor ()               {                       HCURSOR hCur  =  LoadCursor( NULL  , IDC_CROSS ) ;                      ::SetCursor(hCur);               return TRUE;                }       機制分析:            系統在設定游標時 ,會發送一個WM_SETCURSOR訊息 ,此訊息會觸發OnSetCursor函式 , 所以 ,可以在這個函式裡新增修改游標的程式碼 。 3:修改方法三    過載CView裡的PreCreateWindow函式 .    過載方法 :        “View” -> “ClassWizard” (Ctrl + W) -> 右側Messages欄選擇” PreCreateWindow” , 然後點”Add Function” , 點”OK” .    新增程式碼 :             在CDocTestView::PreCreateWindow函式裡新增如下程式碼:          cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW,                                                                                LoadCursor( NULL  , IDC_CROSS ) ,                                                                               (HBRUSH) (COLOR_WINDOW + 1));    機制分析:       預設視窗建立時 , 會以一個結構體WNDCLASS來描述窗體的屬性 ,並利用註冊機制 ,將此視窗屬性註冊到系統中 ,利用AfxRegisterWndClass可以改變窗體本身的屬性 ,並對它重新註冊 。 4:修改方法四       任意函式中修改滑鼠形狀       理論上利用SetCursor(…)函式 , 應該可以在任何時候,任何地方修改滑鼠形狀 ,但實際情況卻並非如此 , 每次呼叫OnMouseMove時候(即每次滑鼠移動時) , 系統會呼叫程式預設原來的一個游標來重新繪製滑鼠形狀 . 所以 , 你如果在其它地方修改游標 , 你會發現這根本不起作用 , 因為每次滑鼠一移動 , 它又恢復到原來的形狀了 . 這裡需要用到另一個API來實現這個功能  SetClassLong() .  .  .  你可以在任何地方呼叫下面的程式碼來修改游標形狀:                        SetClassLong(this->GetSafeHwnd(),                              GCL_HCURSOR ,                               (LONG)LoadCursor(NULL , IDC_CROSS)); 綜合比較:  方法三更加適合於一次性的將預設游標統一替換另一種 ,並不適合於多次頻繁替換。 方法一 ,方法二 ,可以實現游標的多次變換 ,但是都需要在函式中新增額外的變數來控制顯示為不同的游標 。  方法四是最靈活的一種方式 ,可以在任何時候 ,任何函式裡更換滑鼠形狀 。                                 附   錄 1: LoadStandardCursor使用方法 .            LoadStandardCursor用來載入系統自帶的游標 , 呼叫方式如下:                    HCURSOR hCursor = (HCURSOR)AfxGetApp()->LoadStandardCursor(IDC_CROSS);                    ::SetCursor(hCursor); 2: LoadCursor 使用方法             HCURSOR LoadCursor(HINSTANCE hInstance ,        // handle to application instance                                 LPCTSTR   lpCursorName); // name or resource identifier     lpCursorName指的是游標的名字 .     hInstance描述的是含有游標的模組控制代碼 . 這個模組可以是一個可執行檔案 , 也可以為空 . 當模組控制代碼指向一個檔案時 , LoadCursor則從這個檔案中獲取游標 . 當模組控制代碼為空時 , LoadCursor則從系統中獲取游標 .      所以如果你想載入系統自帶的游標 , 可以用下面的程式碼:                          HCURSOR hCur  =  LoadCursor( NULL  , IDC_CROSS ) ;                           ::SetCursor(hCur);      如果想載入資源中自己繪製的游標 , 可以用下面的程式碼:                        HCURSOR hCur  =  LoadCursor(AfxGetInstanceHandle() ,                           MAKEINTRESOURCE(IDC_CURSOR1));                        ::SetCursor(hCur);                                                             2004-12-28  by Ricky  本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/ricky460/archive/2004/12/30/234300.aspx