Win32 WM_SETCURSOR,WM_MOUSEMOVE总是成对?

时间:2008-10-11 14:33:33

标签: winapi controls

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

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

因为可能有数百个项目,所有这些项目都在鼠标下找到它们,所以效率不高,特别是两次(一次用于设置光标,一次用于鼠标移动)。

为了缩短它,你知道WM_SETCURSOR和WM_MOUSEMOVE是否始终成对?在那种情况下,我可以在WM_SETCURSOR期间计算出我想要的东西。另一种选择是在WM_MOUSEMOVE期间设置鼠标光标,但据我所知,它不是一个好的解决方案(会闪烁)。

由于

4 个答案:

答案 0 :(得分:2)

虽然它们目前可能总是作为匹配对出现,但您可能无法依赖此行为。

您可以在WM_MOUSEMOVE(使用SetCursor)期间设置光标,并且它不会闪烁,只要(IIRC),您从WM_SETCURSOR返回TRUE而不做任何事情(即您吃掉了消息),并且您的窗口没有' t有一个分配给它的类游标。

答案 1 :(得分:2)

最重要的是,您的窗口消息处理程序不应该担心持有或计算任何内容。您应该简单地通知应用程序的逻辑,即鼠标可能位于新区域上方并使其找到对象。找到热区(或多个区域)后,缓存其(其)边界并检查以下鼠标移动。一旦鼠标从其中一个移出,您就可以重建热对象列表。

在每次移动鼠标时,您无需在整个控制范围内寻找热区。

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

此外,您应该考虑保存对象坐标的高效数据结构,这样您每次查找 hot 时都不必检查每个对象。

只是我的两欧元。 ;)

答案 2 :(得分:2)

您也可以尝试GetMessagePos()(给出光标屏幕坐标),然后MapWindowPoints(),看看它是否处于热矩形或类似的东西中。

答案 3 :(得分:1)

有没有办法缓存找到的最后一项,如果光标在同一个地方,可以快速查找?这将是最强大的解决方案。