【问题标题】:HWND Change cursor when mouse HoverHWND 鼠标悬停时改变光标
【发布时间】:2015-09-27 23:28:09
【问题描述】:

当鼠标悬停在某个 HWND 时,我需要更改光标图标。我实现了鼠标光标的变化

SetClassLong(hWindow, GCL_HCURSOR, (LONG)LoadCursor (NULL, IDC_CROSS));

但它会将光标应用于与指定 HWND 共享同一类的每个元素。例如,在我的例子中,HWND 是一个 Button 元素,它的类是“Button”,所以我窗口中的所有按钮都将具有相同的光标。如何将光标更改为指定的 HWND?像这样的:

SetHwndCursor(hWindow, GCL_CURSOR, Cursor); //Invented function, just to make the example

谢谢。

【问题讨论】:

    标签: c++ winapi cursor user32 hwnd


    【解决方案1】:

    要显示与类的默认光标不同的光标,您需要处理窗口的WM_SETCURSOR 消息并调用SetCursor 以响应WM_SETCURSOR。简要示例,请参阅Displaying a Cursor。

    您需要对按钮进行子类化以覆盖按钮的 WndProc 以处理 WM_SETCURSOR。使用SetWindowSubclass 对窗口进行子类化(然后在按钮被销毁时删除使用RemoveWindowSubclass 的子类化,以响应WM_NCDESTROY——详见Raymond Chen 的Safer subclassing)。 SetWindowLongPtr 不再推荐用于子类化窗口。

    感谢@IInspectable 和@JonathanPotter 提供有关SetWindowSubclass 的信息。

    【讨论】:

    • Subclassing Controls 描述了使用旧的子类化方法 (SetWindowLongPtr) 的缺点,并解释了正确的方法。
    • 所有现代系统都有 comctl32.dll 版本 6。没有人应该再编写针对 Windows 98 的程序。无论如何,SetWindowSubclass 是在 5.8 中添加的。
    【解决方案2】:

    我通过为有问题的窗口处理WM_SETCURSOR 并使用SetCursor 来完成此操作。

    【讨论】:

    • SetCursor 更改全局光标,而不是本地应用到某个元素,我错了吗?谢谢。
    • 鼠标一移动,它所在的窗口就可以/将设置为它想要的...包括您的应用程序不拥有的窗口。实际上,它只适用于某个元素。
    猜你喜欢
    • 2017-08-14
    • 1970-01-01
    • 2012-09-22
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多