現在的大多數的鼠標都有鼠標輪,比如,當我們浏覽網頁時,鼠標輪上下移動,網頁就自動上下滾動。鼠標輪的確給我們的操作帶來很多方便,但是,在Delphi的大多數控件中都只支持 MouseDown,MouseUp,MouseMove等事件,而不直接支持MouseWheel事件,我們在幫助客戶設計一個查看程序時就碰到這樣的問題。這個查看程序的數據是放在一個DBGrid中的,數據比較多,超出整個屏幕,如果用鼠標輪上下移動,則DBGrid的光標只在可見范圍內移動,超出屏幕的數據必須用鍵盤或右側的滾動條,給用戶造成極大不方便,客戶強烈要求支持鼠標輪操作。但是查看DBGrid的事件屬性沒有對鼠標輪的支持,怎麼辦呢?
我們知道,Windows操作系統是消息驅動的,因此,如果鼠標輪上下滾動,必然會有相應的事件發生,經過查找資料,我們得知當鼠標輪上下滾動時發生的是WM_MOUSEWHEEL事件,既然這樣,我們如果捕獲這個事件,不就可以處理鼠標輪事件了嗎?
說干就干,那就讓我們來為DBGrid增加一個OnMouseWheel事件,制作一個支持鼠標輪的新的DBGrid組件。
讓我們新建一個應用,就叫MyDBGrid吧,選擇菜單File-New Application,然後再選擇菜單File-New-Component
因為我們的新組件是從DBGrid繼承的,所以,Ancestor Type選擇 TDBGrid,Class Name就填我們的組件名稱TmyDbGrid,生成的組件放在Samples頁,點擊OK,則組件的框架就生成了。
現在我們開始做最關鍵的部分。當鼠標輪上下滾動時,發出了WM_MOUSEWHEEL消息,MOUSEWHEEL消息有幾個參數,
1.fwKeys= LOWORD(wParam),表明各種虛擬鍵是否按下,有如下值:
值 說明 MK_CONTROL 按下CTRL鍵 MK_LBUTTON 按下鼠標左鍵 MK_MBUTTON 按下鼠標中鍵 MK_RBUTTON 按下鼠標右鍵 MK_SHIFT 按下Shift鍵
2.zDelta = (short) HIWORD(wParam)
鼠標輪滾動的距離,如果向前則為正,向後為負。
3. xPos =(short) LOWORD(lParam)
yPos=(short) HIWORD(lParam)
鼠標的位置。
Delphi已經定義了兩個和鼠標輪相關的事件,叫TmouseWheelEvent, TmouseWheelUpDownEvent,分別代表鼠標輪事件和鼠標輪上,下滾動事件。因此,我們先在TmyDbGrid中定義三個私有的事件變量:
fMouseWheel:TMouseWheelEvent;
fMouseWheelUp:TMouseWheelUpDownEvent; //鼠標輪上滾事件
fMouseWheelDown: TMouseWheelUpDownEvent; //鼠標輪下滾事件
然後定義publised中定義事件屬性:
property OnMouseWheel:TMouseWheelEvent read fMouseWheel write fMouseWheel;
property OnMouseWheelUp:TMouseWheelUpDownEvent read fMouseWheelUp write fMouseWheelUp;
property OnMouseWheelDown:TMouseWheelUpDownEvent read fMouseWheelDown write fMouseWheelDown;
然後重載TDBGrid的WndProc函數,
procedure WndProc(var Msg: TMessage);override;
我們在WndProc中捕獲鼠標輪的消息,如下:
var
MousePoint:TPoint;
Handled:Boolean;
shift:TShiftState;
begin
if(Msg.Msg=WM_MOUSEWHEEL) then //捕獲鼠標輪事件
begin
MousePoint.X:=LOWORD(Msg.lParam);
MousePoint.Y:=HIWORD(Msg.lParam);
Handled:=false;
if(Msg.wParam>0) then //上滾
fMouseWheelUp(self,shift,MousePoint,Handled)
else //下滾
fMouseWheelDown(self,shift,MousePoint,Handled);
fMouseWheel(self,shift,HIWORD(Msg.wParam),MousePoint,Handled);
if Handled then exit;
end;
inherited;
end;
這樣,我們就基本可以處理鼠標輪事件了,編譯我們的組件,然後選擇菜單Components-Inatll Component,將我們的組件安裝在Samples頁下。
讓我們來試驗一下我們做的組件,新建一個應用,然後選擇Samples下的MyDBGrid組件,其它的用法,和DBGRrid完全一樣,但你可以看見,在你的MyDbGrid的事件中,已經有OnMouseWheel, OnMouseWheelUp, OnMouseWheelDown的選項了。
這樣,你可以在OnMouseWheel, OnMouseWheelUp, OnMouseWheelDown中處理你的動作了,我們也完成了客戶的要求,當客戶移動鼠標輪時,我們在OnMouseWheelUp中加入相應代碼,圓滿解決了客戶的要求。