作为标签页的对话框与其所属的标签控件具有不同的背景颜色

时间:2014-11-06 20:06:47

标签: winapi tabs dialog visual-styles

我正在创建一个带有标签控件的对话框。每个选项卡应显示不同的控件集,因此我在资源编辑器中创建了子对话框以表现得像页面一样。

我使用this帖子中的说明来执行此操作。

在资源编辑器中,我创建了没有边框的对话框,将其样式设置为Child,删除了系统菜单,并将标记ControlControl Parent设置为true

在我的子对话框程序中,我通过添加WM_INITDIALOG并返回EnableThemeDialgTexture(handleOfmyDialog, ETDT_ENABLETAB);来处理TRUE。没有WM_ERASEBKGNDWM_PAINTWM_CTLCOLORDLG被覆盖。

在包含制表符控件的主对话框中,我创建了"子对话框"使用CreateDialog函数,并使用MoveWindow来正确定位它们。

我没有使用EndDialog来销毁"子对话框"在IDCANCELWM_CLOSE上,我认为它们会自动销毁。

我在Windows 8.1上使用Visual Studio 2013来完成所有这些工作。

在Windows 7和Windows 8.1上似乎没有任何问题,但也许我的眼睛在玩弄技巧,因为标签控件的背景颜色类似于对话框的默认背景颜色。这个问题最好在Windows XP上看到,如下图所示:

enter image description here

如何制作儿童对话框的背景颜色" (和他们的子控件如复选框/轨迹栏/单选按钮/静态控件)是透明的(匹配选项卡控件的背景颜色)?

谢谢。

2 个答案:

答案 0 :(得分:2)

这是一个非常直截了当的问题。您无法在以后的Windows版本中看到错误,因为它们不再使用渐变作为“纹理”。 EnableThemeDialogTexture()工作得很好,你的对话框肯定与你的tabcontrol具有相同的纹理。画笔原点从对话框的左上角开始。就像它对tabcontrol一样。但是对话框定位不正确,现在渐变不对齐,对话框不再混合。

您需要移动对话框,使其正确位于标签页区域内。来自MSDN article的相关代码行:

// Size the dialog box. 
SetWindowPos(hwndDlg, NULL, 
    0, 0,                                                           // <=== here!
    rcTab.right + cyMargin + (2 * GetSystemMetrics(SM_CXDLGFRAME)), 
    rcTab.bottom + rcButton.bottom + (2 * cyMargin)
    + (2 * GetSystemMetrics(SM_CYDLGFRAME)) 
    + GetSystemMetrics(SM_CYCAPTION), 
    SWP_NOMOVE | SWP_NOZORDER); 

在tabcontrol的客户区域中定位于(0,0),现在渐变对齐。

答案 1 :(得分:1)

汉斯的观察是正确的,但结论有误。

实际上,EnableThemeDialogTexture()的工作原理:Slider控件的背景上显然有一个渐变。实际上,它与选项卡控件的背景不符。

但是,这不是对齐问题。根据{{​​1}},您在“滑块”控件上看到的渐变是正确的渐变。背景上的渐变实际上是错误的。您可以通过增强的对比度清楚地看到它-背景渐变块状且粗糙,而Slider的渐变效果非常好。

我观察到当主窗口设置EnableThemeDialogTexture()样式而Z顺序错误(子选项卡上方的选项卡)时,这种精确的行为。通过WS_CLIPCHILDREN将子对话框移到Z顺序的顶部,它应该完全对齐并且不再是块状。