CBS_DROPDOWNLIST 组合无法响应 WM_CTLCOLOR... 在 Windows UX 主题下

Posted

技术标签:

【中文标题】CBS_DROPDOWNLIST 组合无法响应 WM_CTLCOLOR... 在 Windows UX 主题下【英文标题】:CBS_DROPDOWNLIST combo fails to respond to WM_CTLCOLOR... under Windows UX theming 【发布时间】:2012-04-05 15:35:53 【问题描述】:

我们有一些 C++ Win32 代码通过响应 WM_CTLCOLOR... 消息将背景颜色应用于某些控件。

当 Windows UX 主题不运行时,这可以正常工作。

在默认主题的 Windows 7 下,具有 CBS_DROPDOWNLIST 样式的组合框仅以主题的灰色背景显示。 CBS_DROPDOWN 组合框正确响应启用主题的背景颜色变化。

我知道我可以删除受影响控件的主题,但这会让它们看起来很奇怪。

既然 MS 似乎已经破坏了 WM_CTLCOLOR... 的东西,那么任何人都知道更改单个主题控件的背景颜色的官方方法。

谢谢 杰夫

【问题讨论】:

只需设置 CBS_OWNERDRAWFIXED 样式标志。这将立即扼杀主题外观,您将获得旧的 Vista 前风格。您的用户可能会觉得这有点令人讨厌,ymmv。 一般来说,尝试自定义主题控件的颜色并不是一个好主意,因为您不知道主题中的颜色是什么,因此您无法知道是否不小心设置了颜色为“灰色灰色”或类似的颜色。 【参考方案1】:

您可以通过NM_CUSTOMDRAW 通知检查您是否可以完成您想要的操作。这些被发送到父级(如 WM_CTLCOLOR... 消息)。使用这些通知,某些控件比其他控件效果更好。您并不总能收到您期望的所有通知。

另一个选项是子类化控件并覆盖 WM_PAINT。这将是很多工作,但它是可行的。 painting with the themes 上有文档。

【讨论】:

遗憾的是,您所指的文档基本上没有用。这是一个令人绝望的窗口区域,文档记录不足。 @DavidHeffernan:你能说得更具体点吗?我已经成功使用了该页面中的一些信息。 您曾经使用过零件和样式文档吗? @DavidHeffernan:是的。我曾经对树视图进行了一系列自定义。【参考方案2】:

如果您想更改主题控件的颜色,您需要使用主题 API 自定义绘制它。这是一项相当棘手的任务,基本上没有记录。祝你好运!

【讨论】:

以上是关于CBS_DROPDOWNLIST 组合无法响应 WM_CTLCOLOR... 在 Windows UX 主题下的主要内容,如果未能解决你的问题,请参考以下文章

WINAPI - 设置组合框下拉菜单的背景和文本颜色

win32day10-组合框/列表框/滚动条/控件的自绘制

nodejs express, ajax 发布 w/jquery 并接收响应

Python 中lambda和zip组合使用报错

求一个ahk组合快捷键的编写方式,内有真相

无法使Slider具有响应能力