1.基本功能
OnMouseMove响应鼠标移动事件
OnMouseWheel响应鼠标中键的滚动
2.参数说明
afx_msgvoidOnMouseMove(UINT nFlags,CPoint point);
nFlags描述:指示是否按下了虚拟按钮,此参数可以是以下值的任意组合
按下CTRL键时的MK_CONTROL
按下鼠标左键时的MK_LBUTTON
MK_MBUTTON当按下鼠标中键(不按下滚动键)
按下鼠标右键时会显示MK_RBUTTON。
按下SHIFT时的MK_SHIFT。
点描述:鼠标的X,Y坐标:此坐标是鼠标基点相对于其所在窗口左上角的位置。它是屏幕像素上的相对位置,而不是绝对位置。
afx_msg BOOL OnMouseWheel(UINT nFlags,shortzDelta,CPointpt);
nFlags与上述相同
zDelta:当它大于0时,向上滚动,而当它小于0时,向下滚动。小于零的值表示向后旋转(朝向用户),而大于零的值表示向后旋转(远离用户)。在Windows下,通常向上滚动以缩小/向上移动窗口,反之亦然。
pt ::鼠标的X和Y坐标基于父窗口的左上角。指定光标的x和y坐标。这些坐标始终相对于窗口的左上角。
实现3.运动的效果
要实现移动,例如用鼠标左键拖动按钮/图片在窗口上移动,就可以达到附加的结果要求:将鼠标放在按钮/图片的A点上,移动后,鼠标点仍在点A
我们通过了
a。检查鼠标是否在按钮/图片上(确保不能将图标移动到任何地方),然后按向左按钮
b。记录鼠标的当前点和最后一点,计算两者的偏移值,然后使用此偏移值移动按钮/图片(MoveWindows)
(记录最后一点的方法可以使用静态变量。完成移动后,将当前点分配给静态变量)(具体实现可以灵活处理)
实现原理是:相对静态-鼠标和对象的相对位置保持不变,鼠标的偏移量就是对象的偏移量

4.实现缩放效果(以鼠标点为中心进行缩放)
要实现缩放,例如滑动中间轮以放大或缩小以放大按钮/图像,还需要满足其他要求:将鼠标放在按钮/图像的A点上,缩放后,鼠标点仍在点A上,并且缩放以鼠标点为中心
a。还要检测鼠标在按钮/图片上(确保您可以缩放按钮/图片的位置不是全部)
b。获取当前按钮/图片的高度和宽度(使用getClientRect)
c。获取相对于按钮/图片位置的当前pt点x,y,然后计算该位置相对于宽度和高度的比例
d。确定zDelta是正值还是负值以放大和缩小(按比例调整图片的高度和宽度),并调整图片左上点(左,上)的位置,以确保c中的比率保持不变(---确保鼠标在中央放大或缩小)
实现原理是:相对运动---鼠标和对象点的位置保持不变,鼠标周围对象点的长和宽成比例缩放。
5.高级算法
对于移动和缩放,如果您已经看过计算机图形或已经经历了矩阵变换矩阵操作,则可以基于这一点来理解这一操作。
已知
translate是翻译操作
缩放是缩放操作
平移操作:平移(向量)向量偏移量
假定坐标的原始值
[X.src
Y.src]
对于二维平面,翻译过程中的翻译量
[X.move,
Y.move]
翻译后坐标的新值
[X.src + X.move,
Y.src + Y.move]

缩放操作:缩放(向量,点)向量缩放量点缩放基点
假定坐标的原始值
[X.src
Y.src]
对于二维平面,缩放量,因为我们当前的缩放比例x / y轴使用相同的量,所以X.scale = Y.scale,统一使用缩放比例
[规模,
比例]
a。对于基于原始中心(0,0)的缩放,缩放结果为
[X.src *比例
Y.src *标度]
b。考虑到指定的点是缩放的基准点,请将指定的基准点设置为
[X.base,
Y.base]
那么缩放的齐次方程是
[scale,0,X.base(1-scale)
0,比例尺,Y.base(1比例尺)
0,0,1]
计算结果(X.src,Y.src)坐标的新值为:
[X.src *比例+ X.base *(1-比例),
Y.src *比例+ Y.base *(1-比例)]
对于中心点的位置,通过缩放可以使其更接近或远离基点,并且可以根据偏移量进行定位。
X.newcenter = X.base-(X.base-X.oldcenter)*比例

Y.newcenter = Y.base-(Y.base-Y.oldcenter)*比例
旋转操作:旋转(角度,点)角度-旋转角度-旋转基点
假定坐标的原始值
[X.src
Y.src]
对于二维平面,将旋转角度设置为@度,然后逆时针旋转
a。如果它绕中心旋转(0,0),
X.dest = R * Cos(OrgAngle + @)= R * sin(OrgAngle)* sin(@)+ R * cos(OrgAngle)* cos(@)= X.src * Sin @ + Y.src * cos @
Y.dest = R * Sin(OrgAngle + @)= X.src * -Sin(@)+ Y.src * cos(@)
相当于乘以矩阵
[sin @,cos @
-sin @,cos @]
b。考虑围绕特定点的旋转,将指定的基点设置为
[,
]
等效于将特定点偏移为(0,0)点,然后在旋转后将其偏移回
X.dest = +(X.src-)* sin @ +()* cos @
Y.dest =-(X.src-)* sin @ +()* cos @
齐次方程是
[sin @,cos @,-* sin @-* cos @
-sin @,cos @,+ * sin @-* cos @
0,0,1]
概述:从图形中的这些计算的角度来看,平移,鼠标点为中心的缩放或旋转的算法部分都是相对基本的应用程序。毕竟,它相对简单,是二维的。
如果您想深入掌握这些知识,可以阅读《计算机图形学》一书。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-363506-1.html
帅哭我