Windows平台如何获取已绘制显示的Static控件的文本颜色
Windows平台获取已显示Static控件文本颜色的可行方案
你之前调用GetTextColor()、GetDCPenColor()无法得到正确结果的核心原因是:这两个接口查询的是当前临时获取的DC的默认状态,Static控件绘制完成后会释放自身绘制流程使用的DC,临时DC不会保留控件绘制时设置的文本色属性,自然无法拿到正确值。
可根据场景选择以下三种可行方案:
- 方案1:发送
WM_CTLCOLORSTATIC消息获取(通用场景首选,可靠性最高)
Static控件走默认绘制逻辑时,会在绘制前向父窗口发送WM_CTLCOLORSTATIC消息,控件实际使用的文本颜色就是该消息处理流程中设置到DC上的颜色,直接模拟这个流程即可拿到准确值,不受DC释放的影响。
参考代码:
注意:该方案仅对走默认绘制逻辑、未开启自绘风格的Static控件生效。HWND h_static = 目标Static控件句柄; HWND h_parent = GetParent(h_static); HDC h_dc = GetDC(h_static); // 模拟控件绘制时的消息触发逻辑 SendMessage(h_parent, WM_CTLCOLORSTATIC, (WPARAM)h_dc, (LPARAM)h_static); // 从消息处理后的DC中提取文本颜色 COLORREF static_text_color = GetTextColor(h_dc); ReleaseDC(h_static, h_dc); - 方案2:主题API读取(适配开启系统视觉样式的标准Static控件)
如果程序引入了ComCtl32 v6版本启用系统视觉样式,未自定义绘制的标准Static控件颜色由系统主题定义,可直接通过主题接口读取:COLORREF theme_text_color = GetSysColor(COLOR_WINDOWTEXT); // 兜底默认值 HTHEME h_theme = OpenThemeData(h_static, L"STATIC"); if (h_theme) { GetThemeColor(h_theme, TEXT_STYLE, TS_NORMAL, TMT_TEXTCOLOR, &theme_text_color); CloseThemeData(h_theme); } - 方案3:像素取色反推(适配所有已显示控件,包括自绘Static)
针对开启了SS_OWNERDRAW风格、完全自定义绘制逻辑的Static控件,可直接读取控件客户区内确定属于文本笔画位置的像素值获取颜色:
注意:该方案要求控件未被遮挡、文本位置可确定,否则会取到错误的颜色值。HDC h_dc = GetDC(h_static); // 传入的坐标需要避开控件边框、背景留白区域,确保取到的是文本像素 COLORREF draw_text_color = GetPixel(h_dc, 文本区域内有效坐标X, 文本区域内有效坐标Y); ReleaseDC(h_static, h_dc);
内容的提问来源于stack exchange,提问作者Antonio Linares Cañas
相关产品推荐
相关产品推荐

