【问题标题】:Win32 WM_SETCURSOR, WM_MOUSEMOVE always in pair?Win32 WM_SETCURSOR,WM_MOUSEMOVE 总是成对的?
【发布时间】:2008-10-11 14:33:33
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

    标签: winapi controls


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        只有我的两欧元。 ;)

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-26
            • 2017-08-26
            • 2016-05-22
            • 1970-01-01
            相关资源
            最近更新 更多