c++ - Windows XP 样式 : Why do we get dark grey background on static text widgets?

标签 c++ user-interface winapi xp-theme

我们正在使用 C++ 和 Win32 编写 Windows 桌面应用程序。我们的对话框具有“Windows XP 风格”的丑陋外观:静态文本的背景是灰色的。对话框背景也是灰色的,这不是问题,但是在选项卡控件中,背景是白色的,文本的灰色背景非常明显。

过去我们自己绘制了很多控件,但现在我们正在尝试尽可能多地使用标准外观,并尽可能避免覆盖标准行为。

我们使用的是 Win32 API,它有点过时了,但我认为即使使用 ATL 也会出现问题。我们正在创建一个 DIALOGTEMPLATE。文本位于“静态”控件 (0x0082) 中。我们为样式设置的唯一标志是“SS_LEFT”。文本控件位于选项卡控件内:“SysTabControl32”,只有一个标志:设置了 WS_CLIPSIBLINGS。我已经尝试过 SS_WHITERECT 和 WS_EX_TRANSPARENT 以及其他设置,但都无济于事。

所有这些都是用标准的 Windows 对话框消息处理程序绘制的。我的主要问题是“我们做错了什么?”而不是“我该如何解决它?”,尽管如果没有人可以帮助我解决第一个问题,我会接受后者。

有什么想法吗?

最佳答案

需要在选项卡控件中实现页面的通常方法才能访问 MS 对此问题的解决方案:-

与其在选项卡区域中创建单独的控件,不如为每个页面创建一个无模式的子对话框并在其上放置控件。创建以主对话框(而非选项卡)作为父对话框的页面对话框,当用户在选项卡之间切换时,只需显示和隐藏相关的页面对话框即可。

在每个页面的 WM_INITDIALOG 处理程序中,调用 uxtheme API EnableThemeDialogTexture

使用 ETDT_ENABLETAB 标志,这会自动更改对话框及其所有子控件的背景颜色,以便在选项卡上适本地绘制。

如果您在页面 DialogProc 中覆盖了 WM_ERASEBKGNDWM_CTLCOLOR*,您将需要恢复为默认处理(返回 FALSE),因为这些方法是对话框代码所在的位置要做它的繁重工作。应该简单地设置样式位,就好像将在普通的 Windows 9X 选项卡式对话框上创建子页面对话框页面一样。

关于c++ - Windows XP 样式 : Why do we get dark grey background on static text widgets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1042415/

相关文章:

c++ - 将 'this' 成员的引用传入 std::thread 的参数

c++ - 如何加载 win32 dll 并使用 fire breath 执行简单的 winAPI

c++ - 如何隐藏/取消隐藏文件而不删除 Windows 上 C++ 中的其他属性

Java、GUI 构建器还是手动编码?

java - java GUI 中这些被阻止的部分是什么

java - JSplitPane 使用 GTK LAF 给出了错误的调整光标大小?

c++ - HttpFilterProc 在 C++ 中不起作用

python - pywintypes.com_error : (-2147221008, 'CoInitialize has not been called.',无,无)

c++ - WritePrivateProfileString 没有在末尾添加属性

简单场景的 C++ OO 继承正确性