使用WM_MOUSEWHEEL
需要把CWnd設定為Focus
ON_WM_MOUSEWHEEL( )
CWnd::OnMouseWheel
afx_msg BOOL OnMouseWheel( UINT nFlags, short zDelta, CPoint pt );
返回值:如果允許鼠標輪滾動,則返回非零值;否則返回0。
參數:
nFlags 指明是否按下了虛擬鍵。這個參數可以是下列值的組合:
· MK_CONTROL 如果CTRL鍵被按下,則設置此位。
· MK_LBUTTON 如果鼠標左鍵被按下,則設置此位。
· MK_MBUTTON 如果鼠標中鍵被按下,則設置此位。
· MK_RBUTTON 如果鼠標右鍵被按下,則設置此位。
· MK_SHIFT 如果SHIFT鍵被按下,則設置此位。
zDelta 指明了旋轉的距離。zDelta值以WHEEL_DELTA,即120的倍數或部分的形式表達。小於零的數表明往回滾動(向着用戶),而大於零的數表明滾向遠處(離開用戶)。用戶可以在鼠標軟件中改變滾輪設置以反轉這種響應。有關這個參數的更多信息參見說明部分。
pt 指定了光標的x和y軸坐標。這些坐標通常是相對於窗口的左上角的。
說明:
當用戶旋轉鼠標滾輪並達到滾輪的下一個刻度時,框架就調用這個成員函數。除非被重載,否則OnMouseWheel調用WM_MOUSEWHEEL的缺省處理。Windows自動將該消息轉發到具有輸入焦點的控件或子窗口。Win32函數DefWindowProc將該消息上傳到擁有它的窗口。
zDelta參數是WHEEL_DELTA的倍數,它被設為120。這個值是要采取的動作的開端,這一類動作(比如向前滾動到下一個刻度)必須為每一個delta產生。
delta被設為120,以允許將來使用更高精度的滾輪,例如沒有刻度的自由旋轉滾輪。這種設備在每次旋轉是可能會發送多個消息,但是每次消息中的值更小。要支持這個可能性,或者可以累計輸入的delta值,直到達到一個WHEEL_DELTA(因此你達到與給定delta的旋轉相同的響應),或者滾動部分行以響應更頻繁的消息。你可以選擇你的滾動精度並累計delta值直到達到WHEEL_DELTA。
重載這個成員函數以提供你自己的鼠標滾輪滾動特性。
注意 OnMouseWheel為Windows NT 4.0處理消息。對於Windows 95或Windows NT 3.51 的消息處理,應使用OnRegisteredMouseWheel。
實現應用程序支持鼠標滾輪的關鍵是,捕獲鼠標滾輪的消息 MSH_MOUSEWHEEL、WM_MOUSEWHEEL。其中MSH_MOUSEWHEEL是為95准備的,需要Intellimouse驅動程序,而WM_MOUSEWHEEL是目前各版本Windows(98/NT40/2000)內置的消息。本文主要處理WM_MOUSEWHEEL消息。下面是WM_MOUSEWHEEL的語法。
WM_MOUSEWHEEL
fwKeys = LOWORD(wParam); /* key flags */
zDelta = (short) HIWORD(wParam);
/* wheel rotation */
xPos = (short) LOWORD(lParam);
/* horizontal position of pointer */
yPos = (short) HIWORD(lParam);
/* vertical position of pointer */
其中:fwKeys指出是否有CTRL、SHIFT、鼠標鍵(左、中、右、附加)按下,允許復合。zDelta傳遞滾輪滾動的快慢,該值小於零表示滾輪向后滾動(朝用戶方向),大於零表示滾輪向前滾動(朝顯示器方向)。lParam指出鼠標指針相對屏幕左上的x、y軸坐標。
滾輪按鈕相當於普通的三鍵鼠標的中鍵,根據滾輪按鈕的動作,Windows分別發出WM_MBUTTONUP、WM_MBUTTONDOWN、WM_MBUTTONDBLCLK消息,這些消息VB已經在鼠標事件中支持。
需要進一步說明的是,對用戶界面鼠標滾輪的操作也要遵循公共用戶界面操作習慣,不要隨意定義一些怪異的操作,如果你編制的應用程序支持鼠標滾輪,請看看是否符合下面這些標准。
垂直滾動:當用戶向后滾動輪子(朝用戶方向),滾動條向下移動;向前滾動輪子(朝顯示器方向),滾動條向上移動。對文檔當前的選擇應該不受影響,對數據庫當前記錄指針不變。
水平滾動:如果同時有垂直滾動條,鼠標滾輪首先應控制上下滾動;當文檔只有水平滾動杠時,用戶向后滾動輪子,滾動條向右移動,向前滾動輪子,滾動條向左移動。對文檔當前的選擇應該不受影響,對數據庫字段選擇不受影響。
滾動速度:鼠標滾輪每滾一個刻痕,對於長文檔移動的行數,應符合控制面板中鼠標的定義(默認移動三行),對短文檔每次滾一行,在任何情況下,決不要超過窗口顯示的行數。
平移:平移事實上就是滾動條的連續操作。平移一般是配合滾輪按鈕的拖拽,最好提供方向指示光標。
自動滾動:自動滾動通常開始於鼠標滾輪按鈕單擊,以后任何擊鍵、鼠標按鍵或者滾動鼠標滾輪終止。滾動方向和速度取決於鼠標偏移滾輪按鈕單擊時原始位置的方向和距離,距原始位置標記越遠自動滾動越快,距離近則慢。應用程序需要提供初始位置位圖以及方向指示圖標。
縮放:在按住 Ctrl 鍵的同時前后滾動滾輪。向后滾動輪子(朝用戶方向),縮小比例;向前滾動輪子(朝顯示器方向),增大比例。
今天調試程序時,發現該消息附帶的坐標不是窗口坐標,而是屏幕座標。后來Google了下,發現不僅如此,此消息和它兄弟消息不一樣,消息直接發送到具有Focus的控件,而不是鼠標底下的控件。