使用WM_MOUSEWHEEL   
    需要把CWnd设定为Focus
  ON_WM_MOUSEWHEEL(   )   
  CWnd::OnMouseWheel   
    
  afx_msg   BOOL   OnMouseWheel(   UINT   nFlags,   short   zDelta,   CPoint   pt   );   
    
  返回值:如果允许鼠标轮滚动,则返回非零值;否则返回0。   
    
  参数:     
  nFlags   指明是否按下了虚拟键。这个参数可以是下列值的组合:   
  ·   MK_CONTROL   如果CTRL键被按下,则设置此位。   
  ·   MK_LBUTTON   如果鼠标左键被按下,则设置此位。   
  ·   MK_MBUTTON   如果鼠标中键被按下,则设置此位。   
  ·   MK_RBUTTON   如果鼠标右键被按下,则设置此位。   
  ·   MK_SHIFT   如果SHIFT键被按下,则设置此位。   
    
  zDelta   指明了旋转的距离。zDelta值以WHEEL_DELTA,即120的倍数或部分的形式表达。小于零的数表明往回滚动(向着用户),而大于零的数表明滚向远处(离开用户)。用户可以在鼠标软件中改变滚轮设置以反转这种响应。有关这个参数的更多信息参见说明部分。   
    
  pt   指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。   
    
    
  说明:   
  当用户旋转鼠标滚轮并达到滚轮的下一个刻度时,框架就调用这个成员函数。除非被重载,否则OnMouseWheel调用WM_MOUSEWHEEL的缺省处理。Windows自动将该消息转发到具有输入焦点的控件或子窗口。Win32函数DefWindowProc将该消息上传到拥有它的窗口。   
  zDelta参数是WHEEL_DELTA的倍数,它被设为120。这个值是要采取的动作的开端,这一类动作(比如向前滚动到下一个刻度)必须为每一个delta产生。   
  delta被设为120,以允许将来使用更高精度的滚轮,例如没有刻度的自由旋转滚轮。这种设备在每次旋转是可能会发送多个消息,但是每次消息中的值更小。要支持这个可能性,或者可以累计输入的delta值,直到达到一个WHEEL_DELTA(因此你达到与给定delta的旋转相同的响应),或者滚动部分行以响应更频繁的消息。你可以选择你的滚动精度并累计delta值直到达到WHEEL_DELTA。   
  重载这个成员函数以提供你自己的鼠标滚轮滚动特性。   
  注意   OnMouseWheel为Windows   NT   4.0处理消息。对于Windows   95或Windows   NT   3.51   的消息处理,应使用OnRegisteredMouseWheel。   
    
    
  实现应用程序支持鼠标滚轮的关键是,捕获鼠标滚轮的消息   MSH_MOUSEWHEEL、WM_MOUSEWHEEL。其中MSH_MOUSEWHEEL是为95准备的,需要Intellimouse驱动程序,而WM_MOUSEWHEEL是目前各版本Windows(98/NT40/2000)内置的消息。本文主要处理WM_MOUSEWHEEL消息。下面是WM_MOUSEWHEEL的语法。     
    
  WM_MOUSEWHEEL   
  fwKeys   =   LOWORD(wParam);   /*   key   flags   */     
  zDelta   =   (short)   HIWORD(wParam);     
  /*   wheel   rotation   */   
  xPos   =   (short)   LOWORD(lParam);     
  /*   horizontal   position   of   pointer   */   
  yPos   =   (short)   HIWORD(lParam);     
  /*   vertical   position   of   pointer   */     
    
  其中:fwKeys指出是否有CTRL、SHIFT、鼠标键(左、中、右、附加)按下,允许复合。zDelta传递滚轮滚动的快慢,该值小于零表示滚轮向后滚动(朝用户方向),大于零表示滚轮向前滚动(朝显示器方向)。lParam指出鼠标指针相对屏幕左上的x、y轴坐标。     
  滚轮按钮相当于普通的三键鼠标的中键,根据滚轮按钮的动作,Windows分别发出WM_MBUTTONUP、WM_MBUTTONDOWN、WM_MBUTTONDBLCLK消息,这些消息VB已经在鼠标事件中支持。     
    
    
  需要进一步说明的是,对用户界面鼠标滚轮的操作也要遵循公共用户界面操作习惯,不要随意定义一些怪异的操作,如果你编制的应用程序支持鼠标滚轮,请看看是否符合下面这些标准。     
    
  垂直滚动:当用户向后滚动轮子(朝用户方向),滚动条向下移动;向前滚动轮子(朝显示器方向),滚动条向上移动。对文档当前的选择应该不受影响,对数据库当前记录指针不变。     
    
  水平滚动:如果同时有垂直滚动条,鼠标滚轮首先应控制上下滚动;当文档只有水平滚动杠时,用户向后滚动轮子,滚动条向右移动,向前滚动轮子,滚动条向左移动。对文档当前的选择应该不受影响,对数据库字段选择不受影响。     
    
  滚动速度:鼠标滚轮每滚一个刻痕,对于长文档移动的行数,应符合控制面板中鼠标的定义(默认移动三行),对短文档每次滚一行,在任何情况下,决不要超过窗口显示的行数。     
    
  平移:平移事实上就是滚动条的连续操作。平移一般是配合滚轮按钮的拖拽,最好提供方向指示光标。     
    
  自动滚动:自动滚动通常开始于鼠标滚轮按钮单击,以后任何击键、鼠标按键或者滚动鼠标滚轮终止。滚动方向和速度取决于鼠标偏移滚轮按钮单击时原始位置的方向和距离,距原始位置标记越远自动滚动越快,距离近则慢。应用程序需要提供初始位置位图以及方向指示图标。     
    
  缩放:在按住   Ctrl   键的同时前后滚动滚轮。向后滚动轮子(朝用户方向),缩小比例;向前滚动轮子(朝显示器方向),增大比例。

今天调试程序时,发现该消息附带的坐标不是窗口坐标,而是屏幕座标。后来Google了下,发现不仅如此,此消息和它兄弟消息不一样,消息直接发送到具有Focus的控件,而不是鼠标底下的控件。

这个值向前为正,向后为负。每次都是正负120或其倍数,当增量超过120时,才会判断鼠标滚轮有效移动。

鼠标滚轮的移动系数K=Delta/120

WM_MOUSEWHEEL消息的更多相关文章

  1. TControl的消息覆盖函数大全(15个WM_函数和17个CM_函数,它的WndProc就处理鼠标与键盘消息)

    注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中)(特别注意,这里居然没有WM_PAINT函数): TControl = class(TComponent) private ...

  2. WM消息对应的Message消息中的Lparam和WParam

    具体的消息表示: 1. WM_PAINT消息,LOWORD(lParam)是客户区的宽,HIWORD(lParam)是客户区的高 2. 滚动条WM_VSCROLL或WM_HSCROLL消息,LOWOR ...

  3. 【转】各种消息下wParam及lParam值的含义

    转载自:http://bbs.fishc.com/forum.php?mod=viewthread&tid=52668#lastpost 01.WM_PAINT消息 LOWORD(lParam ...

  4. MFC 消息中( WPARAM wParam,LPARAM lParam)包含信息

    windows的消息具有以下两个参数: (1)字参数(wParam) (2)长参数(lParam) 字参数和长参数都是32位整数,用于提供消息的附带消息,是消息传递过程中参数的载体.附加信息的消息号取 ...

  5. wparam , lparam 传递消息

    01.WM_PAINT消息 LOWORD(lParam)是客户区的宽,HIWORD(lParam)是客户区的高 02.滚动条WM_VSCROLL或WM_HSCROLL消息 LOWORD(wParam) ...

  6. WM_MOUSEWHEEL、WM_LBUTTONDOWN等父子窗口消息传递陷阱

    mfc中,碰到以下问题:父对话框A.子窗口B.B是CWnd对象.需要在B中处理WM_MOUSEWHEEL.WM_LBUTTONDOWN等消息. 所以在B中增加对应的消息处理,发现B中的消息循环中,收不 ...

  7. 用DirectX实现魔方(三)视角变换及缩放(附源码)

    在本系列第一篇介绍过鼠标按键的功能,如下. 左键拖拽 - 旋转魔方 右键拖拽 - 变换视角 滚轮 - 缩放魔方 今天研究一下如何实现后面两个功能,用到的技术主要是Arcball,Arcball是实现M ...

  8. wParam与lParam的区别

    wParam与lParam的区别 lParam 和 wParam 是宏定义,一般在消息函数中带这两个类型的参数,通常用来存储窗口消息的参数. LRESULT CALLBACK WindowProc(H ...

  9. WIN32编程经验总结

    一 窗口和消息 1. 前缀: 2 WPARAM和LPARAM的意义在Windows是一种16位系统时,WndProc的第三个参数被定义为WORD,是一个16位的无符号整数,而第四个参数被定义为一个LO ...

随机推荐

  1. 解决nginx到后端服务器Connection: close问题

    以下是官方原文: By default, NGINX redefines two header fields in proxied requests, “Host” and “Connection”, ...

  2. Atitit.软件开发的几大规则,法则,与原则p821.doc

    Atitit.软件开发的几大规则,法则,与原则p821.doc 1. 设计模式六大原则2 1.1. 设计模式六大原则(1):单一职责原则2 1.2. 设计模式六大原则(2):里氏替换原则2 1.3.  ...

  3. [华为机试练习题]5.IP地址推断有效性

    题目 推断输入的字符串是不是一个有效的IP地址 具体描写叙述: 请实现例如以下接口 boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符 ...

  4. 分页技术框架(Pager-taglib)学习三(pager-taglib中传递参数时中文乱码问题)

    一.问题描述 问题: 使用<pg:param name="key" />标签传递中文参数时,会有乱码. 原因: 因为它默认是用gb2312来对添加的参数进行编码,如果你 ...

  5. makefile之目录搜索&自动依赖

    目录搜索 在一个大工程中,一般会将源文件和中间生成文件放在不同的目录,而且不会污染源码所在的目录.当需要编译不同目录下的源文件时,就需要指定路径,那么怎样让路径的表示以及源文件的引用更加灵活.就要用到 ...

  6. HTML5 的位置

    HTML5 的位置 在HTML5COL学院的前面几个章节中我们已经对HTML5 Geolocation API有了一定认识,接下来我们要对位置做些更有意思的处理:看看你与我们HTML5COL学院的办公 ...

  7. continue和pass測试

    >>> for i in range(1,10): print i try:int('sdfa') except:pass 1 2 3 4 5 6 7 8 9 >>> ...

  8. 【iOS越狱开发】如何将应用打包成.ipa文件

    在项目开发中,我们常常需要将工程文件打包成.ipa文件,提供给越狱的iphone安装. 下面是一种方法: 1.首先应该给工程安装好配置文件(这里不再敖述),在ios device的状态下,运行成功. ...

  9. hdu6058 Kanade's sum 区间第k大

    /** 题目:Kanade's sum 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6058 题意:给定[1,n]的排列,定义f(l,r,k)表示区间[l ...

  10. 利用JMeter的beanshell进行接口的加密处理

    最近项目中在做http协议的接口测试,其中接口请求报文数据有个字段值需要用到加密后的签名,即出于网络传输过程中,对数据安全的考虑,要对请求的数据进行特定的处理(加密),再进行请求. 刚开始由于项目赶进 ...