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中加入相應代碼,圓滿解決了客戶的要求。