5

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

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

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

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

谢谢

4

4 回答 4

3

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

于 2011-04-07T10:35:53.760 回答
2

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

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

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

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

只是我的两欧元。;)

于 2008-10-11T15:49:52.247 回答
2

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

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

于 2008-10-11T14:42:47.030 回答
1

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

于 2008-10-11T14:51:26.843 回答