如何使用与父级相同的视觉样式动态创建控件?

时间:2009-12-23 22:59:38

标签: c++ user-interface visual-studio-2005 winapi

我正在使用Visual Studio 2005(以及C ++中的win32 API),我有一个使用内置对话框编辑器设计的窗口。

在运行时,我希望能够使用CreateWindow()向其添加新控件。这是有效的,但是我创建的控件看起来都很难看。出于具体的目的,我添加的控件是一个TabControl,当我使用内置的对话框编辑器添加它时,选项卡标签中的文本看起来不错。当我在运行时使用CreateWindow()创建它时,文本大而粗,看起来不合适。

我在MSDN上找到Using Windows XP Visual Styles,它似乎描述了正确区域中的内容,但是当我按照其中的说明(嵌入清单)时,动态创建的控件似乎比一个更新的样式对话框编辑器使用(选项卡控件的背景颜色更浅)。

我还找到了SetWindowTheme()函数。我不太确定如何使用这个函数...我希望我可以在窗口上使用GetWindowTheme(),然后将结果传递给SetWindowTheme()以使它们看起来相同,但是GetWindowTheme()会返回一个HTHEME,我不知道你甚至可以用这些来做什么......你绝对不能将它们传递给SetWindowTheme()

1 个答案:

答案 0 :(得分:5)

如果您希望人们能够提供帮助,您真的需要告诉我们您目前正在做什么(代码)。这个答案将成为一个正确答案的猜测。如此。

您可能不需要使用主题句柄,只要为您的应用启用了主题,只要您正确设置控件的窗口样式即可。

您需要确保向您创建的窗口发送WM_SETFONT消息。许多标准控件默认为一个非常难看的向后兼容字体,直到你给它们一个新的。在大多数情况下,您可以使用GetStockObject(DEFAULT_GUI_FONT)(或GetStockFont(),如果包含windowsx.h)作为发送它们的字体。如果你使用股票字体,那么你不必跟踪它是否存在并在以后释放它。

您还需要为大多数控件设置WS_EX_CLIENTEDGEWS_EX_STATICEDGE样式以获得更新的显示行为。我认为当主题打开时通常是WS_EX_STATICEDGE,而当它们不是时WS_EX_CLIENTEDGE。但是你需要玩这些。使用Spy ++查看各种控件并查看它们使用的样式并确保匹配它们。关闭这些样式会产生禁用主题绘图的副作用。

请注意,这些是_EX_样式标记,因此您需要使用CreateWindowEx而不是CreateWindow

也可能有其他事情,但试试这个,看看你需要多远。