【问题标题】:How to get correct background and control colors in property pages?如何在属性页中获得正确的背景和控件颜色?
【发布时间】:2017-10-01 18:31:32
【问题描述】:

我正在尝试在使用 MFC 的 win32 api 中动态生成的属性页中动态生成的属性表中正确处理背景颜色(尽管我希望我的问题很笼统, 并且不限于 MFC, 但由于我的代码和示例使用它, 无论如何它与我的问题密切相关)。

所以我们有一个:

CPropertySheet

包含多个

CPropertyPage

我动态生成任何给定页面的内容 - 从文件资源使用自定义对话框定义语言 - 除了说 - 控件列表及其坐标在给定页面中创建,页面大小调整为容纳他们。这个逻辑很好用。

但是,不起作用的是每个页面的控件和背景使用对话框默认颜色/画笔绘制。

我尝试了多种方法来强制它使用硬编码的属性表/页面会使用的白色/画笔进行绘制。

这有两个重要的部分:

  1. 页面背景
  2. 控制(在页面上)背景

对于#1,我已经尝试过:

  • 从父窗口类获取背景画笔(它是对话框bkgrd)(如果我这样做并询问选项卡控件,也是如此)
  • 将属性页更改为使用 WS_EX_TRANSPARENT(生成页面时框架不调用PreCreateWindow,即PropertySheet::AddPage

对于#2,我已经尝试过:

  • 覆盖 OnWndMsg / WM_CTLCOLORSTATIC 以将该请求转发到 (A) 父级(工作表)和 (B) 到选项卡控件(首先需要白色)。

但是,每当我使用上述任何“请求背景/转发请求”时,我都会沿着链向上到达工作表或选项卡控件 - 我会得到对话框背景颜色,而不是我期望的白色。

使用 Spy64,我可以看到对于完全硬编码的属性表/页面 - 我可以看到的唯一可辨别的差异是在 AddPage(或其道德等价物)中创建的对话框窗口具有 WS_CHILD 而不是我的其中有WS_POPUP(其余样式似乎相同,例如WS_VISIBLE|DS_3DLOOK|DS_FIXEDSYS|DS_SETFONT|DS_CONTROLWS_EX_CONTROLPARENT

因此,除了WS_CHILD 之外,我发现与我正在创建的内容以及从标准资源(即硬编码)正常工作的另一个属性表没有显着差异。

我也很困惑它是如何正常工作的——因为转发诸如 ctrlcolor 消息之类的东西没有正确响应——并且要求类似的 windows 背景颜色没有——那么在标准情况下如何控件和页面的背景颜色显示为白色,而不是对话框背景?

任何想法或帮助将不胜感激 - 我的想法有点用完了......

【问题讨论】:

  • WS_EX_TRANSPARENT 几乎没用,它所做的只是改变不同窗口的绘制顺序。它实际上并没有使任何东西变得透明。

标签: windows user-interface winapi visual-c++ mfc


【解决方案1】:

当在 Windows XP 中添加视觉样式时,他们真的想炫耀这个新功能,因此他们将选项卡背景设为渐变(实际上是拉伸图像)而不是单一颜色,这在执行自定义绘图的旧应用程序中造成了问题以对话框画笔为背景。

因此,只有具有 comctl32 v6 清单的应用程序才能获得新外观,但出现了问题;旧的属性表外壳扩展会加载到新的应用程序(包括资源管理器)中,并且看起来会出错。

要解决此问题,他们还要求您(或您的 UI 框架)调用 EnableThemeDialogTexture(.., ETDT_ENABLETAB) 以获得正确的标签页外观。

好像事情还不够棘手,有一个undocumented requirement,页面上还需要一个按钮或静态控件!

如果您有自定义控件,如果它们是部分透明的,则它们必须在您绘制时调用 DrawThemeParentBackground

【讨论】:

  • 这一切在 Win 8/10 中仍然成立吗?我的应用程序使用 v6 清单,并且在 XP 中以适当的主题出现(或者直到我们去年放弃支持)。在其中,硬编码的对话框只有一个丑陋的白色背景(在我看来,MS 又愚蠢了,在他们应该使用对话框背景的地方使用白色,因为 EDIT 控件看起来像白色的地狱,主题与否)。在 VS 2015 中也一样 - 只是白色。 UGOS :(
【解决方案2】:

原来我的旧代码已经定义了一个 ON_WM_ERASEBKGND 处理程序 - 删除它(以及我上面的所有尝试)使它工作。

所以简单地什么都不做是正确的答案。哦!!!

我把我的耻辱留在这里,以防其他人绊倒! [哎呀!]

(如果有人更深入地了解这个机制是如何工作的,仍然很感兴趣)

【讨论】:

    猜你喜欢
    • 2018-10-05
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2021-08-28
    相关资源
    最近更新 更多