LoadCursor 加载不同的鼠标光标
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);
總結
以上是生活随笔為你收集整理的LoadCursor 加载不同的鼠标光标的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue 计算属性 computed
- 下一篇: 写给大数据开发初学者的话 | 附教程