我正在创建一个带有标签控件的对话框。每个选项卡应显示不同的控件集,因此我在资源编辑器中创建了子对话框以表现得像页面一样。
我使用this帖子中的说明来执行此操作。
在资源编辑器中,我创建了没有边框的对话框,将其样式设置为Child
,删除了系统菜单,并将标记Control
和Control Parent
设置为true
。
在我的子对话框程序中,我通过添加WM_INITDIALOG
并返回EnableThemeDialgTexture(handleOfmyDialog, ETDT_ENABLETAB);
来处理TRUE
。没有WM_ERASEBKGND
,WM_PAINT
或WM_CTLCOLORDLG
被覆盖。
在包含制表符控件的主对话框中,我创建了"子对话框"使用CreateDialog
函数,并使用MoveWindow
来正确定位它们。
我没有使用EndDialog
来销毁"子对话框"在IDCANCEL
或WM_CLOSE
上,我认为它们会自动销毁。
我在Windows 8.1上使用Visual Studio 2013来完成所有这些工作。
在Windows 7和Windows 8.1上似乎没有任何问题,但也许我的眼睛在玩弄技巧,因为标签控件的背景颜色类似于对话框的默认背景颜色。这个问题最好在Windows XP上看到,如下图所示:
如何制作儿童对话框的背景颜色" (和他们的子控件如复选框/轨迹栏/单选按钮/静态控件)是透明的(匹配选项卡控件的背景颜色)?
谢谢。
答案 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顺序的顶部,它应该完全对齐并且不再是块状。