【问题标题】:Office COM add-in, dialogs don't have the luna/aero theme (they look like Windows 98 classic look)Office COM 加载项,对话框没有 luna/aero 主题(它们看起来像 Windows 98 经典外观)
【发布时间】:2011-01-19 14:49:27
【问题描述】:

我有一个 Office 2007 插件,它添加了一个工具栏,其中包含一些按钮和处理程序的 OnClick 事件。当用户单击按钮时,会显示一些对话框。但这些对话框具有过时的 Windows 98 外观和矩形按钮,即使在 Windows 7 上也是如此。

我知道您需要一个清单文件来启用主题,但这个插件是使用 Visual Studio 2008 创建的,它会自动添加一个清单,如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>

我应该改变什么以使我的对话框使用当前主题而不是 Windows 98 的外观? 我读过关于隔离意识的文章,但这似乎也不起作用。

【问题讨论】:

    标签: com themes ms-office add-in uxtheme


    【解决方案1】:

    正如您所发现的,添加清单只是成功的一半。您还需要在加载项初始化时调用 InitCommonControlsEx function,然后再创建任何控件。这是为您使用的常用控件注册窗口类所必需的。

    如果您对文档持怀疑态度,Microsoft 的 Raymond Chen 不久前发布了 article on his blog,正好解决了这个问题。

    如果您有任何其他问题,请查看这篇文章:How to apply Windows XP themes to Office COM add-ins

    【讨论】:

    • 我在插件类的构造函数中添加了 InitCommonControlsEx,但似乎没有任何效果。难道我做错了什么? CConnect::CConnect() { INITCOMMONCONTROLSEX initcommctrl = { sizeof(initcommctrl), 0xffffffff }; InitCommonControlsEx(&initcommctrl);消息框(0,0,0,0); } 这里显示的 MessageBox 没有主题。
    • 我还在我的 stdafx 顶部添加了#define ISOLATION_AWARE_ENABLED 1 但仍然没有运气。
    • 我刚刚意识到 InitCommonControlsEx 无法返回 FALSE,但快速搜索论坛帖子解释说问题确实来自清单,我应该将此 pragma 添加到我的代码中:#pragma comment(linker ,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' ""version='6.0.0.0' processorArchitecture='' publicKeyToken='6595b64144ccf1df' language=''\"") 成功了 :) 事实上,事实证明 INITCOMMONCONTROLSEX 根本不需要,可能清单文件中的某些内容在我的项目中不正确。不过还是谢谢你:)
    • @satuon:很高兴您解决了问题。但我质疑您的评论,即“事实证明 INITCOMMONCONTROLSEX 根本不需要”。 blog post I linked to 实际上准确地解释了为什么需要这个,即使它似乎没有它也可以工作。
    • 谢谢,我添加了 InitCommonControlsEx。我以为它是由框架本身调用的(因为一切正常),但是当我在它上面放置一个断点时,我发现它没有被调用。还有一个问题 - 我将 ICC_STANDARD_CLASSES 作为 INITCOMMONCONTROLSEX 中的标志传递,对吗?
    猜你喜欢
    • 2011-07-05
    • 2017-05-11
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多