HWND 鼠标悬停时改变光标
Posted
技术标签:
【中文标题】HWND 鼠标悬停时改变光标【英文标题】:HWND Change cursor when mouse Hover 【发布时间】: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
谢谢。
【问题讨论】:
【参考方案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 更改全局光标,而不是本地应用到某个元素,我错了吗?谢谢。 鼠标一移动,它所在的窗口就可以/将设置为它想要的...包括您的应用程序不拥有的窗口。实际上,它只适用于某个元素。以上是关于HWND 鼠标悬停时改变光标的主要内容,如果未能解决你的问题,请参考以下文章