【问题标题】:How do I dynamically create controls with the same visual style as their parent?如何动态创建具有与其父级相同视觉样式的控件?
【发布时间】:2009-12-23 22:59:37
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    可能还有其他的东西,但试试这个,看看能走多远。

    【讨论】:

    • 你是对的。我需要设置字体,然后它看起来很好。我想我认为默认的 gui 字体是默认设置的字体……我真傻。
    • 是的,问题是它们向后兼容的是 WINDOWS 3.0。但是确实有一些应用程序依赖于这种行为,所以 - 你来了。
    • 据说DEFAULT_GUI_FONT 是退化的。使用SystemParametersInfo 获取合适的LOGFONT,然后调用CreateFontIndirect 获取您自己的HFONT。见:blogs.msdn.com/b/oldnewthing/archive/2005/07/07/436435.aspx
    猜你喜欢
    • 1970-01-01
    • 2021-07-20
    • 2019-08-29
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多