让Delphi的DBGrid支持鼠标轮

2016-01-29 14:27 23 1 收藏

让Delphi的DBGrid支持鼠标轮,让Delphi的DBGrid支持鼠标轮

【 tulaoshi.com - Delphi 】

  现在的大多数的鼠标都有鼠标轮,比如,当我们浏览网页时,鼠标轮上下移动,网页就自动上下滚动。鼠标轮的确给我们的操作带来很多方便,但是,在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

来源:https://www.tulaoshi.com/n/20160129/1493343.html

延伸阅读
标签: PHP
我自己正在学习这方面的东西,刚刚看到这篇配置文章,又学会一些东西,发上来也和大家分享一下。 Windows系统内置的Internet 信息服务(IIS)对ASP具有良好的支持,因此在IIS中调试ASP网页是非常方便的。但有些朋友的网页采用PHP编程技术,默认情况下,IIS是不支持PHP的,手工配置IIS的PHP调试环境对我们这些菜鸟来说是非常...
标签: Web开发
ZendFramework模板默认扩展名是.phtml,用DW打开后默认是使用纯文本编辑,不能高亮显示也不能显示代码提示等。只需简单修改Dreamweaver的配置文件,即可让DW打开phtml后是使用PHP引擎解析: 找到如下文件: %Dreamweaver安装目录%\ configuration\documenttypes\mmdocumenttypes.xml 将原始内容: documenttype id=”PHP_MySQL” servermod...
标签: 电脑入门
制作支持鼠标、光驱、USB设备的DOS启动光盘需要使用包含上述设备驱动程序的DOS启动软盘镜像文件,并且需要编辑DOS启动盘中的自动批处理程序Autoexec.bat和设备配置程序Config.sys文件。对于一般用户而言,搜集上述设备的驱动程序并编辑系统文件并不容易,因此建议用户使用网上发布的免费DOS启动软盘镜像文件。本实例所使用的DOS启动软盘镜像文...
标签: Web开发
先说明,这个办法只限于iframe中的子页面也是本地页面(不能引用外网页面) ======方法===== 第一步 js部分 function getSize() {        var xScroll, yScroll;               if (window.in...
今天在CSDN论坛里面游逛,发现这样的一个帖子《刚才看到一位武林高手的几行精妙代码,百思不得其解,希望各位指点》,本着向各大武林高手学习的态度,我看完了整个帖子,发现内容甚为经典,记录于此,作个总结:   type   TStringGridEx = class(TStringGrid); procedure TForm1.Button1Click(Sen...

经验教程

330

收藏

68
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部