VC設置鼠標形狀

消息下:

SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS));

或是:

HCURSOR   hc;

hc=LoadCursor(NULL,IDC_CROSS);

             SetCursor(hc);

IDC_APPSTARTING     帶小沙漏的標準箭頭   
IDC_ARROW           標準箭頭   
IDC_CROSS           十字光標   
IDC_HAND            windows   2000:手型   
IDC_HELP            帶問號的箭頭   
IDC_IBEAM           i型標   
IDC_ICON            obsolete   for   applications   marked   version   4.0   or   later.     
IDC_NO              禁止符號   
IDC_SIZE            obsolete   for   applications   marked   version   4.0   or   later.   use   idc_sizeall.     
IDC_SIZEALL         十字箭頭   
IDC_SIZENESW        指向東北和西南的雙向箭頭   
IDC_SIZENS          指向南和北的雙向箭頭   
IDC_SIZENWSE        指向西北和東南的雙向箭頭   
IDC_SIZEWE          指向東西的雙向箭頭   
IDC_UPARROW         上箭頭   
IDC_WAIT            沙漏

當我們要自己選擇一個圖標的時候按照以下幾個步驟:

1、定義一個成員變量: HCURSOR m_cursor;

          m_cursor = AfxGetApp()->LoadCursor(IDC_CURSOR1);

也可以

        m_cursor = LoadCursorFromFile(".\\res\\123.cur");

2、重載 OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)函數,

3、在函數裏面寫入:

     ::SetCursor(m_cursor);

OK,我們自定義的鼠標完成;

當然我們也可以用ani格式的動態鼠標形狀,可以使程序更帥;

   和載入.cur一樣:例如;

m_cursor = LoadCursorFromFile(".\\res\\123.ani");

-----------------------------------------------------------------------------------------------------------

當然也可以先把文件加載進來直接導入:按照以下步驟:

1、先把ani文件導入;

2、隨便保存成什麼名字;然後在程序的.rc文件下,把對應的代碼 修改成以下代碼:

IDR_FLY                 ANICURSOR DISCARDABLE   "fly.ani"

或者

IDR_FLY                 CURSOR DISCARDABLE   "fly.ani"

不然有的時候可能出現錯誤,我現在也沒有搞清楚是什麼問題;

或者直接在.rc文件下添加代碼:

IDR_FLY                 ANICURSOR DISCARDABLE   "fly.ani"

或者

IDR_FLY                 CURSOR DISCARDABLE   "fly.ani"

就不用第一步驟了;然後

m_cursor = AfxGetApp()->LoadCursor("IDR_FLY");

這樣就可以實現了;

ani格式我們可以通過一些動畫或gif格式轉換過來;

下面一些理論的東西可能對我們也有用,是轉自其他人的博客的內容:

轉粘(vckbase):   


windows編程中有兩種方法改變指針:一種是當應用的主窗口類註冊時,爲wndclass結構提供一個全程光標指針,另外一種方法是在程序中處理 wm_setcursor消息來設置鼠標光標。標準的mfc應用程序使用第一種方法自動在主窗口註冊時將光標指針設置爲一個箭頭。如果要改變光標指針,則可以通過在主窗口或子窗口中重載消息wm_setcursor的處理函數來重新設置鼠標指針。 

// handle wm_setcursor in button class 
bool cmybutton::onsetcursor(cwnd* pwnd, uint nhittest, uint msg) 

::setcursor(m_hmycursor); 
return true; 



當用戶將鼠標指針移到按鈕上時,鼠標不被捕獲,windows發送一個wm_setcursor消息到按鈕。從上面onsetcursor的代碼中可以看到,它傳遞一個參數是窗口句柄- 即鼠標指針所指的窗口,這裏指的是按鈕本身;onsetcursor傳遞的第二個參數是nhittest,這是一個鼠標點擊測試代碼,它以htxxx開頭,用於wm_nchittest消息;onsetcursor傳遞的第三個參數是觸發事件的鼠標消息的消息id-例如,wm_mousemove。 wm_setcursor是專門用來設置鼠標指針的消息,當設置了鼠標指針以後,應該讓它返回true以防止windows再作缺省處理。 

wm_setcursor的處理機制是這樣的,如果有父窗口的話,缺省的窗口過程首先發送wm_setcursor消息到父窗口,如果父窗口處理 wm_setcursor消息,則windows不再作任何多餘的事情,處理完消息便結束。如果父窗口不處理wm_setcursor消息, windows讓子窗口來處理wm_setcursor,如果子窗口也不做任何處理,windows使用全程光標指針,如果沒有全程光標指針,則使用箭頭指針。 


如果你在程序中要是使用動態光標指針,你必須決定是在子窗口處理wm_setcursor消息還是在父窗口中處理wm_setcursor消息。兩種方法各有利弊,根據具體情況而定。一般總是讓對象決定它們自己的行爲屬性-也就是說最好在子窗口中做處理。本文中的子窗口即按鈕。這就要派生一個新的按鈕類,新的按鈕類有自己的消息映射及其消息處理過程。可以使用類嚮導來產生新的按鈕類,但那樣要做的事情太多。如果你已經有自己的按鈕類,那當然是在自己的按鈕類中處理wm_setcursor消息。如果沒有自己的按鈕類而又想偷懶的話,那就在對話框中處理wm_setcursor消息得啦,只是不要向面向對象專家說是我告訴你這麼做的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章