始终为弹出窗口的tooltip控件如何实现自定义绘制?
自定义绘制Tooltip的实现方案
- 首先明确核心前提:Tooltip自带的
WS_POPUP、WS_EX_TOOLWINDOW样式,和控件绑定父窗口(所有者窗口)并不冲突。WS_POPUP仅代表Tooltip不属于WS_CHILD类型的子控件,顶层弹出窗口完全可以合法设置所有者窗口,该所有者窗口就是接收Tooltip通知消息的载体。 - 步骤1:创建Tooltip时绑定所有者窗口
调用CreateWindowEx创建Tooltip控件时,直接将目标父窗口句柄传入hWndParent参数即可,无需修改Tooltip自带的默认样式。系统会自动将Tooltip的所有通知消息路由到该所有者窗口的消息循环中,满足NM_CUSTOMDRAW机制的要求。 - 步骤2:正确配置工具关联参数
发送TTM_ADDTOOL消息关联目标工具时,将TOOLINFO结构体的hwnd字段设置为上述所有者窗口句柄,按业务需求配置uFlags和uId字段,确保通知消息路由路径正确。 - 步骤3:在所有者窗口处理自定义绘制消息
在所有者窗口的WM_NOTIFY消息处理逻辑中,判断消息携带的NMHDR结构体的code字段是否为NM_CUSTOMDRAW,确认是Tooltip的绘制通知后,将lParam强转为NMCUSTOMDRAW类型,根据dwDrawStage阶段执行对应绘制逻辑:- 若需全局自定义样式,可在
CDDS_PREPAINT阶段返回CDRF_SKIPDEFAULT,自行绘制整个Tooltip的背景、文本、边框等内容 - 若只需修改局部样式,可在
CDDS_PREPAINT阶段返回CDRF_NOTIFYITEMDRAW,接收子项绘制通知后针对性修改文本颜色、背景色等属性
- 若需全局自定义样式,可在
注意:不要主动移除Tooltip自带的
WS_POPUP或WS_EX_TOOLWINDOW样式,否则会破坏Tooltip原生的自动定位、显隐逻辑,导致控件行为异常。
内容的提问来源于stack exchange,提问作者user15284017
相关产品推荐
相关产品推荐

