如何在基于对话框的程序中动态设置鼠标指针
本文旨在示范在對話框的按鈕上(或其它控制上)使用單獨的鼠標指針。Windows編程中有兩種方法改變指針:一種是當應用的主窗口類注冊時,為 WNDCLASS結構提供一個全程光標指針(HCURSOR),另外一種方法是在程序中處理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的代碼中可以看到,它傳遞一個參數是窗口句柄(pWnd)- 即鼠標指針所指的窗口,這里指的是按鈕本身;OnSetCursor傳遞的第二個參數是nHitTest,這是一個鼠標點擊測試代碼, 它以HTXXX開頭,用于WM_NCHITTEST消息;OnSetCursor傳遞的第三個參數是觸發事件的鼠標消息的消息ID-例 如,WM_MOUSEMOVE。WM_SETCURSOR是專門用來設置鼠標指針的消息,當設置了鼠標指針以后,應該讓它返回TRUE以防止 Windows再作缺省處理。
WM_SETCURSOR的處理機制是這樣的,如果有父窗口的話,缺省的窗口過程首先發送WM_SETCURSOR消息到父窗口,如果父窗口處理 WM_SETCURSOR消息(即返回TRUE),則Windows不再作任何多余的事情,處理完消息便結束。如果父窗口不處理WM_SETCURSOR 消息(即返回FALSE),Windows讓子窗口來處理WM_SETCURSOR,如果子窗口也不做任何處理(返回FALSE),Windows使用全 程光標指針,如果沒有全程光標指針,則使用箭頭指針。
如果你在程序中要是使用動態光標指針,你必須決定是在子窗口處理WM_SETCURSOR消息還是在父窗口中處理WM_SETCURSOR消息。兩種方法 各有利弊,根據具體情況而定。一般總是讓對象決定它們自己的行為屬性-也就是說最好在子窗口中做處理。本文中的子窗口即按鈕。這就要派生一個新的按鈕類, 新的按鈕類有自己的消息映射及其消息處理過程。可以使用類向導來產生新的按鈕類,但那樣要做的事情太多。如果你已經有自己的按鈕類,那當然是在自己的按鈕 類中處理WM_SETCURSOR消息。如果沒有自己的按鈕類而又想偷懶的話,那就在對話框中處理WM_SETCURSOR消息得啦,只是不要向面向對象 專家說是我告訴你這么做的。
本文附帶一個簡單的基于對話框的程序,MyCursor,這個例子程序示范了兩種方法來改變光標指針。如果將鼠標移到按鈕上(“OK”鍵和“Cancel”鍵),光標指針變為藍色手指,它是通過在對話框中處理OnSetCursor實現的,另外,如果將鼠標指針移到帶下劃線的超鏈接上,光標指針又變為另外一個Windows中常常使用的手指。它是通過在窗口子類中實現的。CStaticLink是一個通用的可重用類,,其中CStaticLink::OnSetCursor的大 多數代碼處理是從win32hlp.exe可執行程序中吸取手型指針,它們與本文有關光標設置的內容關系不大,我沒有全部列出來,如果你對細節感興趣,可以從本文的開始處下載范例程序......最后祝大家編程愉快!
轉載于:https://www.cnblogs.com/rogee/archive/2011/03/31/2000470.html
總結
以上是生活随笔為你收集整理的如何在基于对话框的程序中动态设置鼠标指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL 根据身份证号查询个人信息
- 下一篇: 服务器物理硬盘序列号,服务器硬盘序列号查