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
發佈了23 篇原創文章 · 獲贊 9 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章