成都彩蝶花卉网站建设案例,两个wordpress公用用户,上海有名的广告公司,韩版做哪个网站好有一位读者问了这样一个问题#xff1a; “为什么鼠标光标的设定绑定在窗口类#xff0c;而不是窗口上#xff1f;”
这个问题隐含地假设了光标与窗口类相关联。虽然每个窗口类都有一个关联的光标#xff0c;但决定使用哪个光标的是窗口。
光标设置过程在 WM_SETCURSOR 消…有一位读者问了这样一个问题 “为什么鼠标光标的设定绑定在窗口类而不是窗口上”
这个问题隐含地假设了光标与窗口类相关联。虽然每个窗口类都有一个关联的光标但决定使用哪个光标的是窗口。
光标设置过程在 WM_SETCURSOR 消息的文档中进行了描述请看如下 DefWindowProc 函数在处理 WM_SETCURSOR 消息之前会将其传递到父窗口。如果父窗口返回 TRUE则停止进一步处理。将消息传递到窗口的父窗口可使父窗口控制子窗口中光标的设置。DefWindowProc 函数还使用此消息将光标设置为箭头如果它不在工作区中或已注册的窗口类的光标如果它位于工作区中。
以上文档几乎涵盖了整个光标的设置过程。从现在开始我所写的只是重述这几句话。
WM_SETCURSOR 会传递到光标下方的子窗口。显然它转到子窗口而不是父窗口因为文档说 DefWindowProc 将消息转发到其父窗口。 如果消息最初发送给父窗口则没有人可以将消息转发到) 此时窗口过程可以捕获 WM_SETCURSOR 消息设置光标并返回 TRUE。因此窗口在决定光标是什么时具有第一优先级。
如果窗口不处理 WM_SETCURSOR 消息则 DefWindowProc 会将消息转发给父级父级又可以决定是处理该消息还是依次转发到其父级。一种可能性是其中一个祖先窗口将处理消息、设置光标并返回 TRUE。在这种情况下TRUE 返回值告诉 DefWindowProc 光标已设置无需再执行任何工作。
另一种更有可能的可能性是没有一个祖先窗口关心设置光标。每次返回到 DefWindowProc 时光标将设置为窗口类中关联的光标。
下图描述了整个过程。 假设我们有三个窗口A、B 和 C其中 A 是顶层窗口B 是子窗口C 是孙窗口它们在 WM_SETCURSOR 中都没有做任何特别的事情。进一步假设鼠标位于窗口 C 上 请移步至 topomel.com 以查看图片
请注意观察WM_SETCURSOR 从底部窗口 C开始向上冒泡到顶部窗口 A然后向下移动到窗口 C。在向上时它会询问每个窗口是否要设置光标如果它一直到顶部没有人发表意见那么在向下时每个窗口都会将光标设置为 C 类光标。
现在当然沿途的任何窗口都可以决定“我正在设置光标”并返回 TRUE在这种情况下消息处理将立即停止。
所以你看窗口确实决定了光标是什么。是的有一个与该类关联的游标但仅当窗口决定使用它时才使用它。如果要将光标与窗口关联可以通过显式处理WM_SETCURSOR 消息来实现而不是让 DefWindowProc 默认为类光标。
这位读者提出了另外一个问题”许多程序在每个 WM_MOUSEMOVE 调用 SetCursor。这合理吗”
虽然没有规则禁止在 WM_MOUSEMOVE 消息中设置光标但这会导致一些问题。
首先不那么严重的后果是你将无法参与 WM_SETCURSOR 谈判因为你没有在那里进行光标设置。
但真正的问题是你会得到一个光标闪烁。WM_SETCURSOR 将被发送到你的窗口以确定光标。由于你没有执行任何操作因此它可能会变成窗口类光标。然后你得到你的WM_MOUSEMOVE 并再次设置光标。
结果每次用户移动鼠标时光标都会变为类光标然后变为默认光标。
让我们看看实际的效果从我们的例子程序开始并进行以下更改 请移步至 topomel.com 以查看图片
运行程序并将鼠标移到工作区上。请注意它在箭头类光标在 WM_SETCURSOR 期间设置和十字光标在 WM_MOUSEMOVE 期间设置之间闪烁。
总结
新技能 GET: 在正确的位置设置你的鼠标光标这个正确的位置是WM_SETCURSOR 消息的处理函数中。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一里面有很多关于Windows的小知识对于广大Windows平台开发者来说确实十分有帮助。 本文来自《What is the process by which the cursor gets set?》