MFC中修改光標形狀


修改光標形狀,如果是修改系統內光標形狀,那就很簡單了,直接是用::SetCursor(::LoadCursor(NULL,MAKEINTRESOURCE(IDC_CURSOR1)))就可以修改成功了,但這只是更改一時的光標形狀。如果想要長久修改光標形狀,就需要在光標消息中修改鼠標形狀了。

1、首先,添加WM_SETCURSOR消息,得到消息函數OnSetCursor;

2、在消息函數OnSetCursor中,添加以下代碼

1 BOOL CMy123456Dlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
2 {
3     HCURSOR hcur = ::LoadCursor(NULL,IDC_CROSS);
4     ::SetCursor(hcur);
5     return TRUE;
6     return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
7 }

其中要注意的是,LoadCursor中的第一個參數為進程句柄,當調用的是系統的鼠標的時候,應該為NULL,但是當使用的是自定義的鼠標圖案的時候,則為當前的進程句柄,例如在對話框程序總可以用AfxGetApp()->m_hInstance

第二個參數就是則應為一個字符串,通過鼠標圖案的資源ID得到的一個字符串,例如在資源視圖新插入一個Cursor,為其命名為IDC_CURSOR1,則其光標資源的ID就是IDC_CURSOR1,那么我們就可以把第二參數設置為MAKEINTRESOURCE(IDC_CURSOR1);因此,我們加載自定義光標圖形就可以如下代碼

1 BOOL CMy123456Dlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
2 {
3     HCURSOR hcur = ::LoadCursor(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDC_CURSOR1));
4     ::SetCursor(hcur);
5     return TRUE;
6     return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
7 }

 

其中,用LoadCursor加載光標,得到的大小是有系統自己規定的,我們自己沒有辦法修改。所以,當我們需要修改光標大小時,往往使用的是LoadImage函數;這個方法也是大部分人加載自定義光標時所使用的方法。其代碼如下:

1 BOOL CMy123456Dlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
2 {
3     HCURSOR hcur = (HCURSOR)::LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDC_CURSOR1),IMAGE_CURSOR,5,5,LR_COPYFROMRESOURCE);
4     ::SetCursor(hcur);
5     return TRUE;
6     return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
7 }
 
LoadImage
函數功能:該函數裝載圖標,光標,或位圖。
函數原型:HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int cyDesired,UINT fuLoad);
 
參數介紹:
  • hinst:指向需加載該資源的module;可以填寫當前進程的句柄也可以為NULL,不過一般可以將這個參數設為NUll。
  • lpszName:標識要加載的資源;可以填寫資源文件名的路徑,如果fuLoad設為LR_LOADFROMFILE,則該參數為資源的文件名,如位圖文件、ICON文件,當然也包括Cursor文件。如果是這個方式填寫,在運行軟件的地方要把資源文件拷貝過去,否則找不到光標的;也可以填寫MAKEINTRESOURCE(IDC_CURSOR1),fuLoad要設置為LR_COPYFROMRESOURCE;用這個方式,就不需要在額外拷貝資源文件了,所以一般是使用這個方式。
  • uType:指明加載的資源類型,它的值可以是IMAGE_BITMAP. 加載位圖;IMAGE_CURSOR. 加載cursor;IMAGE_ICON. 加載ICON。
  • cxDesired,光標的寬度,值是以像素為單位的整數。
  • cyDesired ,光標的長度,值是以像素為單位的整數。
  • fuLoad,資源加載的方式,當值為LR_LOADFROMFILE時,指從文件加載。

 

LoadCursorFromFile

這個函數也可以加載光標。參數直接填寫資源文件名。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM