Winapi Win32 WM_设置光标,WM_鼠标移动是否始终成对?

Winapi Win32 WM_设置光标,WM_鼠标移动是否始终成对?,winapi,controls,Winapi,Controls,我正在使用Win32控件。此控件上可能有数百个“项”。这些不是窗口,而是内部对象(例如:矩形)。根据鼠标位置,我想更改鼠标光标。这很好,我可以使用WM_SETCURSOR 同时,基于鼠标移动,我想显示一个状态栏,显示当前鼠标下对象的详细信息。为此,我可以使用WM_MOUSEMOVE 因为可能有成百上千个项目,在鼠标下移动所有项目以查找其中一个,所以这不是很有效,尤其是两次(一次用于设置光标,一次用于鼠标移动) 简而言之,你知道WM_SETCURSOR和WM_MOUSEMOVE是否总是成对的吗?在

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

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

因为可能有成百上千个项目,在鼠标下移动所有项目以查找其中一个,所以这不是很有效,尤其是两次(一次用于设置光标,一次用于鼠标移动)

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


谢谢

虽然它们目前可能总是成对出现,但您可能无法依赖这种行为


您可以在WM_MOUSEMOVE(使用SetCursor)期间设置光标,只要(IIRC)您不做任何操作(即,您吃掉消息)就从WM_SetCursor返回TRUE,并且您的窗口没有为其分配类光标,光标就不会闪烁。

是否有办法缓存找到的最后一项,如果光标在同一个位置,是否设置查找快捷方式?这将是最健壮的解决方案。

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

您不必在每次鼠标移动时都在控件上搜索热点区域

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

此外,您还应该考虑一种保存对象坐标的高效数据结构,这样您就不必在每次查找热门对象时都检查每个对象


只有我的两欧元

您也可以尝试
GetMessagePos()
(提供光标屏幕坐标),然后
MapWindowPoints()
查看它是否位于热矩形中,或者类似的位置