让Delphi的DBGrid支持鼠标轮

真够呛的ABB

真够呛的ABB

2016-01-29 14:27

让Delphi的DBGrid支持鼠标轮,让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.wPara
展开更多 50%)
分享

猜你喜欢

让Delphi的DBGrid支持鼠标轮

Delphi
让Delphi的DBGrid支持鼠标轮

Delphi中数据网格DBGrid应用

Delphi
Delphi中数据网格DBGrid应用

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

让VB应用程序支持鼠标滚轮

编程语言 网络编程
让VB应用程序支持鼠标滚轮

让CButtonST 类支持鼠标掠过时发声

C语言教程 C语言函数
让CButtonST 类支持鼠标掠过时发声

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Delphi中实现DBGrid列宽度自动调整

编程语言 网络编程
Delphi中实现DBGrid列宽度自动调整

在Delphi的DBGrid中插入其他可视组件

编程语言 网络编程
在Delphi的DBGrid中插入其他可视组件

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

利用Delphi编写Socket通信程序

利用Delphi编写Socket通信程序

Flash MX 2004 ActionScript图文教程(十五)

Flash MX 2004 ActionScript图文教程(十五)
下拉加载更多内容 ↓