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

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

我在MSDN上发现了Using Windows XP Visual Styles,它似乎在正确的区域中描述了内容,但是当我按照其中的说明(嵌入 list )进行操作时,动态创建的控件似乎比对话框编辑器所使用的控件新的样式(标签控件的背景颜色要浅得多)。

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

最佳答案

如果您希望人们能够提供帮助,那么您确实需要向我们展示您目前在做什么(代码)。这个答案将与正确答案一样多。所以。

您可能不需要弄乱主题句柄,只要为应用程序启用了主题就足够了,只要您正确设置控件的窗口样式即可。

您需要确保将WM_SETFONT消息发送到创建的窗口。许多标准控件默认使用一种难看的向后兼容字体,直到您为它们提供了新字体为止。在大多数情况下,您可以使用GetStockObject(DEFAULT_GUI_FONT)(如果包括windowsx.h,则使用GetStockFont())作为发送它们的字体。如果使用普通字体,则不必跟踪它,以后再释放它。

您还需要为大多数控件设置WS_EX_CLIENTEDGEWS_EX_STATICEDGE样式,以获取较新的显示行为。我认为打开主题时通常是WS_EX_STATICEDGE,没有打开主题时是WS_EX_CLIENTEDGE。但是您将需要尝试这些。使用Spy ++浏览各种控件,查看它们使用什么样式,并确保它们匹配。保留这些样式会导致禁用主题绘图的副作用。

请注意,这些是_EX_样式标志,因此您将需要使用CreateWindowEx而不是CreateWindow
也许还有其他事情,但是尝试一下,看看能走多远。

10-07 13:37
查看更多