梦见和去世的亲人打架:让Delphi的DBGrid支持鼠标轮
来源:百度文库 编辑:偶看新闻 时间:2024/04/29 20:23:14
让Delphi的DBGrid支持鼠标轮
------------------------------------------------------------------------------
现在的大多数的鼠标都有鼠标轮,比如,当我们浏览网页时,鼠标轮上下移动,网页就自动上下滚动。鼠标轮的确给我们的操作带来很多方便,但是,在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中加入相应代码,圆满解决了客户的要求。
------------------------------------------------------------------------------
现在的大多数的鼠标都有鼠标轮,比如,当我们浏览网页时,鼠标轮上下移动,网页就自动上下滚动。鼠标轮的确给我们的操作带来很多方便,但是,在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中加入相应代码,圆满解决了客户的要求。
delphi 中 dbgrid 的 Column.Field 是什么意思?
delphi中的dbgrid控件的缺省值?
如何让DELPHI scrollbar 控件支持IBM PC兼容鼠标的滚轮操作!
在delphi中如何让DBGRID中的内容显示出来
delphi dbgrid透明
请问哪有delphi的dbgrid控件 下载 !谢谢
有谁知道哪里有delphi的dbgrid控件下载啊!
delphi 如何打印dbgrid内容
delphi dbgrid用shift多选?
delphi里怎样让image图片跟随鼠标的拖动
ASP.NET中如何实现 类似DELPHI中DBGrid的表格?
delphi 中要改变dbgrid当前行的颜色怎么实现?
delphi 中要改变dbgrid当前行的颜色怎么实现?
一个让好几天也没有解决的问题(dbgrid)
dbgrid delphi 怎样着色 详细点 谢谢!
delphi 合并数据表问题 access ado dbgrid
怎样在DELPHI中自动设置DBGRID的宽度,其宽度随内容自动改变,程序如何写呢?
DBGrid相同数据图片[最好用Delphi回答]
有人做国delphi中的dbgrid控件吗?
delphi中dbgrid滚动条BUG怎么解决?
delphi怎么取得鼠标当前的坐标
delphi怎么载入ani格式的鼠标
delphi怎么载入ani格式的鼠标
vb DBGrid 控件的问题