3

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

我已经使用这篇文章中的说明来做到这一点。

在资源编辑器中,我制作了没有边框的对话框,将它们的样式设置为Child,删除了系统菜单,并设置了标志Control和。Control Parenttrue

在我的子对话框程序中,我WM_INITDIALOG通过添加EnableThemeDialgTexture(handleOfmyDialog, ETDT_ENABLETAB);和返回TRUE. 否WM_ERASEBKGNDWM_PAINTWM_CTLCOLORDLG已被覆盖。

在包含选项卡控件的主对话框中,我创建了具有CreateDialog功能的“子对话框”,并习惯于MoveWindow正确定位它们。

我没有用来销毁orEndDialog上的“子对话框” ,我认为它们会自动销毁。IDCANCELWM_CLOSE

我已经在 Windows 8.1 上使用 Visual Studio 2013 来完成这一切。

在 Windows 7 和 Windows 8.1 上似乎没有问题,但也许我的眼睛在和我开玩笑,因为选项卡控件的背景颜色与对话框的默认背景颜色相似。该问题在 Windows XP 上最为明显,如下图所示:

在此处输入图像描述

如何使“子对话框”(及其子控件,如复选框/轨迹栏/单选按钮/静态控件)的背景颜色透明(与选项卡控件的背景颜色匹配)?

谢谢你。

4

2 回答 2

2

这是一个非常直接的问题。您在更高版本的 Windows 上看不到错误,因为它们不再使用渐变作为“纹理”。EnableThemeDialogTexture() 工作得很好,您的对话框肯定与您的选项卡控件具有相同的纹理。画笔原点从对话框的左上角开始。就像它对 tabcontrol 所做的那样。但是对话框没有正确定位,现在渐变未对齐并且对话框不再混合。

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

// 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) 处,现在渐变对齐。

于 2014-11-08T22:36:13.890 回答
1

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

确实EnableThemeDialogTexture()有效:Slider 控件的背景上显然有渐变。确实它与选项卡控件的背景不相符。

然而,这不是对齐问题。您在 Slider 控件上看到的渐变是根据EnableThemeDialogTexture(). 背景上的渐变实际上是错误的。您可以通过增强的对比度清楚地看到它 - 背景渐变是块状和粗糙的,而滑块的渐变非常精细。

当主窗口WS_CLIPCHILDREN设置了样式而 Z 顺序错误(子窗口上方的标签)时,我观察到了这种确切的行为。通过将子对话框移动到 Z 顺序的顶部,SetWindowPos(child, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE)它应该完全对齐并且不再是块状的。

于 2019-10-19T09:47:16.897 回答