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 主题下的主要内容,如果未能解决你的问题,请参考以下文章