MFC改變滑鼠指標

2021-08-03 12:54:28 字數 2897 閱讀 1738

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

機制分析:

系統在設定游標時 ,會傳送乙個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用來載入系統自帶的游標 , 呼叫方式如下:

::setcursor(hcursor);

2: loadcursor 使用方法

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 

MFC改變滑鼠指標

windows程式和doc程式很大的不同 就在於windows有乙個亮麗的圖形介面和簡捷的操作方式 而滑鼠就是windows程式中最重要的乙個操作手段 有朋友向我諮詢如何修改滑鼠形狀 這本來是乙個簡單的問題 但是當朋友向我詢問進一步的,更加深入的操作機制時 我才發現裡面隱藏著更多的問題 回到家裡研究...

mfc改變滑鼠形狀

windows 程式和doc程式很大的不同 就在於windows有乙個亮麗的圖形介面和簡捷的操作方式 而滑鼠就是windows程式中最重要的乙個操作手段 有朋友向我諮詢如何修改滑鼠形狀 這本來是乙個簡單的問題 但是當朋友向我詢問進一步的,更加深入的操作機制時 我才發現裡面隱藏著更多的問題,回到家裡研...

CSS HTML 改變滑鼠指標形狀

改變滑鼠指標形狀的方法有兩種 第一種 用的來改變滑鼠指標形狀。另一種是 利用第三方控制項的方法,而我自己最常用的是第一種 用css樣式表來改變滑鼠指標形狀 我們先來看第一種 用來改變滑鼠指標形狀。有些時候我們並不需要文字,加鏈結,而且還想要加鏈結時的滑鼠樣式。這就用到了我們的css樣式表來滑鼠指標形...