使用 WinXp 常用控件时编辑控件背景颜色的奇怪行为

Posted

技术标签:

【中文标题】使用 WinXp 常用控件时编辑控件背景颜色的奇怪行为【英文标题】:Strange behaviour of edit control background color when using WinXp common controls 【发布时间】:2010-12-09 21:58:21 【问题描述】:

我遇到了一个奇怪的问题(好吧,至少我觉得它很奇怪 =))。我正在编写自己的 GUI 库,它是 Windows api 的包装器(是的,我知道 WTL 和 MFC 之类的框架 =))。在当前阶段,我已经以这种方式封装了常用控件:例如,Edit 类由一个简单的窗口和一个标准的编辑窗口组成( MainWindow -> GhostWindow -> EditBox )。这就是我如何在编辑类本身中更改编辑的背景颜色:

myedit->SetBkColor ( RGB ( 0, 0, 0 ) );

它运行良好,直到我调用 InitCommonControlsEx 并将清单文件附加到我的程序。完成此操作后,我的编辑只有在获得焦点时才能更改颜色。老实说,我对为什么会有这样的行为以及我做错了什么没有一个全面的想法,所以我会感谢任何帮助。

谢谢你,#535。

【问题讨论】:

【参考方案1】:

    当您附加版本 6 清单时,无需调用 InitcommonControlsEx。

    无论如何。加载第 6 版通用控件后,XP 主题甚至可用于标准 Windows 控件。控件的背景颜色使用 xp 主题颜色绘制,因此 WM_CTLCOLOR* 消息的使用较少。

    您目前正在使用 WM_CTLCOLOR* 消息覆盖各种控制元素的冷却器?

【讨论】:

1.哦,谢谢,我不知道这个。 2.好的,但是有没有办法让控制行为更具体。我的目标是进行控制,当我将鼠标悬停在它上面时可以改变背景,然后在鼠标光标离开时改变回来。我想使用winXp主题的唯一原因是默认的旧式按钮非常难看。 3. 是的。 除了使控件完全自定义绘制之外,我不相信它可以从 xp 主题颜色覆盖控件的背景颜色。我没有调查的一件事实际上是制作一组主题数据,并使用主题 api 将其加载为当前应用程序主题。我相信它不可能创建新的系统主题,因为 uxtheme.dll 只会加载(由 MS)签名的主题文件,我不知道这是否适用于每个应用程序的主题。 (假设这样的事情甚至是可能的)。 MSDN 中的“Visual Styles Reference”有前途,也有前途:有很多 API 可以用主题数据做各种事情,但没有明显的方法来生成自己的。它基本上似乎只不过是一个描述 ux-theme 如何在内部设置标准窗口控件的大型文档。 谢谢!据我所知,使用 xp 主题的控件会带来一些限制,不幸的是我对此无能为力。 嗯...实际上我还想弄清楚一件事,有没有办法从版本 6 ctrl 库中仅加载特定控件,但据我所知,这是不可能的=(【参考方案2】:

嗯,一切都比我想象的要容易得多。我太不专心了=(当一个人不使用样式时,一个手杖使用 ::SetBkColor(...) 来更改背景颜色,并从 WM_CTLCOLOR* 返回画笔以更改边框颜色。启用样式后情况会有所不同. 现在 ::SetBkColor(...) 对应于 focus 颜色,返回的画笔改变了背景颜色。羞愧于我 =(

【讨论】:

以上是关于使用 WinXp 常用控件时编辑控件背景颜色的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

是否可以更改 CMFCEditBrowseCtrl 控件的背景颜色?

常用控件一

设置搜索栏范围的背景颜色

MFC设置静态文本框,编辑框等控件背景和字体颜色

Qt 常用控件美化

设置gridview控件标题行背景色的属性为啥?