关于winapi:Win32 WM_SETCURSOR,WM_MOUSEMOVE总是成对出现吗?

Win32 WM_SETCURSOR, WM_MOUSEMOVE always in pair?

我正在使用Win32控件。 此控件上可能有数百个"项目"。 这些不是窗口,而是内部对象(例如:矩形)。 根据鼠标位置,我想更改鼠标光标。 很好,我可以使用WM_SETCURSOR。

同时,基于鼠标移动,我想显示一个状态栏,其中显示了有关鼠标当前对象的详细信息。 为此,我可以使用WM_MOUSEMOVE。

因为可能有成百上千个项目,所以将它们全部移动到鼠标下面才能找到一个项目,所以效率很低,尤其是两次(一次用于设置光标,一次用于鼠标移动)。

简而言之,您是否知道WM_SETCURSOR和WM_MOUSEMOVE是否总是成对? 在那种情况下,我可以计算WM_SETCURSOR期间的需求。 另一种选择是在WM_MOUSEMOVE期间设置鼠标光标,但据我所知这不是一个好的解决方案(会闪烁)。

谢谢


您还可以尝试GetMessagePos()(提供光标屏幕坐标),然后尝试MapWindowPoints()并查看它是否在热矩形中或类似的地方。


最重要的是,您的窗口消息处理程序不应该担心持有或计算任何东西。您应该简单地向应用程序发出信号,表明鼠标可能位于新区域上并使其找到对象。一旦找到热点区域(或多个区域),请缓存其边界,并检查以下鼠标移动的边界。一旦鼠标从其中之一移出,您就可以重建您的热点对象列表。

您不必在每次鼠标移动时都在控件上寻找热点区域。

如果可能有许多对象共享同一区域,则存在z顺序问题。创建这些对象并处理它们的运动时,请考虑一下。

另外,您还应该考虑一种有效的数据结构,该结构可保存对象坐标,因此您不必在每次查找热点对象时都检查每个对象。

我的两欧元。 ;)


尽管它们目前可能总是配对,但您可能不能依靠这种行为。

您可以在WM_MOUSEMOVE期间设置光标(使用SetCursor),并且不会闪烁,只要(IIRC),您无需执行任何操作即可从WM_SETCURSOR返回TRUE(即,您吃掉了消息),并且窗口没有分配给它的类光标。


有什么方法可以缓存找到的最后一个项目,并在光标位于相同位置的情况下简化查找操作?那将是最可靠的解决方案。