WM_MOUSEWHEEL消息
使用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消息的更多相关文章
- TControl的消息覆盖函数大全(15个WM_函数和17个CM_函数,它的WndProc就处理鼠标与键盘消息)
注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中)(特别注意,这里居然没有WM_PAINT函数): TControl = class(TComponent) private ...
- WM消息对应的Message消息中的Lparam和WParam
具体的消息表示: 1. WM_PAINT消息,LOWORD(lParam)是客户区的宽,HIWORD(lParam)是客户区的高 2. 滚动条WM_VSCROLL或WM_HSCROLL消息,LOWOR ...
- 【转】各种消息下wParam及lParam值的含义
转载自:http://bbs.fishc.com/forum.php?mod=viewthread&tid=52668#lastpost 01.WM_PAINT消息 LOWORD(lParam ...
- MFC 消息中( WPARAM wParam,LPARAM lParam)包含信息
windows的消息具有以下两个参数: (1)字参数(wParam) (2)长参数(lParam) 字参数和长参数都是32位整数,用于提供消息的附带消息,是消息传递过程中参数的载体.附加信息的消息号取 ...
- wparam , lparam 传递消息
01.WM_PAINT消息 LOWORD(lParam)是客户区的宽,HIWORD(lParam)是客户区的高 02.滚动条WM_VSCROLL或WM_HSCROLL消息 LOWORD(wParam) ...
- WM_MOUSEWHEEL、WM_LBUTTONDOWN等父子窗口消息传递陷阱
mfc中,碰到以下问题:父对话框A.子窗口B.B是CWnd对象.需要在B中处理WM_MOUSEWHEEL.WM_LBUTTONDOWN等消息. 所以在B中增加对应的消息处理,发现B中的消息循环中,收不 ...
- 用DirectX实现魔方(三)视角变换及缩放(附源码)
在本系列第一篇介绍过鼠标按键的功能,如下. 左键拖拽 - 旋转魔方 右键拖拽 - 变换视角 滚轮 - 缩放魔方 今天研究一下如何实现后面两个功能,用到的技术主要是Arcball,Arcball是实现M ...
- wParam与lParam的区别
wParam与lParam的区别 lParam 和 wParam 是宏定义,一般在消息函数中带这两个类型的参数,通常用来存储窗口消息的参数. LRESULT CALLBACK WindowProc(H ...
- WIN32编程经验总结
一 窗口和消息 1. 前缀: 2 WPARAM和LPARAM的意义在Windows是一种16位系统时,WndProc的第三个参数被定义为WORD,是一个16位的无符号整数,而第四个参数被定义为一个LO ...
随机推荐
- 不懂Git,别说自己是程序猿–20分钟git快速上手(转)
在Git如日中天的今天,不懂git都不好意思跟人说自己是程序猿.你是不是早就跃跃欲试了,只是苦于没有借口(契机). 好吧,机会就在今天. 给我20分钟,是的,只要20分钟, 让你快速用上git. 我们 ...
- FreeMarker静态化文件解决SEO推广问题
1.问题背景 SEO一直是站点对外推广的一个重要手段,如何可以让搜索引擎高速搜索到站点对于增强站点的浏量,提升站点对外形象有着重要意义.那么如何可以对SEO进行优化呢?一个很经常使用的手段就是在网页的 ...
- php实现IP地址和数字相互转换
echo $a=ip2long ("202.97.224.68");//地址转换成数字 系统自带的函数 注:这里面有一个要注意的地方,大概由于PHP无法正确判断转换完的数字类型,出 ...
- VUE详解
渐进式框架 声明式渲染(无需关心如何实现).组件化开发.客户端路由(vue-router).大规模的数据状态(vuex).构建工具(vue-cli) 全家桶:vue.js+vue-router+vue ...
- 点滴积累【JS】---JQuery实现条形统计图,适用于选择题等统计
效果: 思路:前台JS实现动态数据效果,后台可以拼接字符串或者用JSON加载数据 代码: <%@ Page Language="C#" AutoEventWireup=&qu ...
- springboot整合docker部署(两种构建Docker镜像方式)--2019-3-5转
原文:https://www.cnblogs.com/shamo89/p/9201513.html 项目结构 package hello; import org.springframework.boo ...
- SQL 数据库分页语句
declare @pagesize integer,@cpage integer; ; ; SELECT TOP (@pagesize) * FROM (SELECT row_number() ove ...
- 文件上传之 commons-fileupload(一)
一 .简单介绍 使用最为广泛的Java文件上传组件,Struts本身采用这个包来处理文件上传.其基本原理: FileUpload组件将页面提交的所有元素(普通form表单域,如text和文 ...
- redis数据类型List的安全队列和不安全队列
在学习RPOPLPUSH命令的时候,官方文档中有提到安全队列和不安全的队列,一开始没有看懂,现在理解了做个笔记. 一般情况下,我们可以借助List来实现消息队列,比如一个客户端通过命令LPUSH(BL ...
- Scrapy中用xpath/css爬取豆瓣电影Top250:解决403HTTP status code is not handled or not allowed
好吧,我又开始折腾豆瓣电影top250了,只是想试试各种方法,看看哪一种的方法效率是最好的,一直进行到这一步才知道 scrapy的强大,尤其是和selector结合之后,速度飞起.... 下面我就采用 ...