【发布时间】:2017-10-01 18:31:32
【问题描述】:
我正在尝试在使用 MFC 的 win32 api 中动态生成的属性页中动态生成的属性表中正确处理背景颜色(尽管我希望我的问题很笼统, 并且不限于 MFC, 但由于我的代码和示例使用它, 无论如何它与我的问题密切相关)。
所以我们有一个:
CPropertySheet
包含多个
CPropertyPage
我动态生成任何给定页面的内容 - 从文件资源使用自定义对话框定义语言 - 除了说 - 控件列表及其坐标在给定页面中创建,页面大小调整为容纳他们。这个逻辑很好用。
但是,不起作用的是每个页面的控件和背景使用对话框默认颜色/画笔绘制。
我尝试了多种方法来强制它使用硬编码的属性表/页面会使用的白色/画笔进行绘制。
这有两个重要的部分:
- 页面背景
- 控制(在页面上)背景
对于#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_CONTROL和WS_EX_CONTROLPARENT。
因此,除了WS_CHILD 之外,我发现与我正在创建的内容以及从标准资源(即硬编码)正常工作的另一个属性表没有显着差异。
我也很困惑它是如何正常工作的——因为转发诸如 ctrlcolor 消息之类的东西没有正确响应——并且要求类似的 windows 背景颜色没有——那么在标准情况下如何控件和页面的背景颜色显示为白色,而不是对话框背景?
任何想法或帮助将不胜感激 - 我的想法有点用完了......
【问题讨论】:
-
WS_EX_TRANSPARENT几乎没用,它所做的只是改变不同窗口的绘制顺序。它实际上并没有使任何东西变得透明。
标签: windows user-interface winapi visual-c++ mfc