Office COM插件,对话框没有luna/aero主题(它们看起来像Windows 98经典外观)

Office COM插件,对话框没有luna/aero主题(它们看起来像Windows 98经典外观),com,themes,ms-office,add-in,uxtheme,Com,Themes,Ms Office,Add In,Uxtheme,我有一个Office2007的加载项,它为OnClick事件添加了一个带有一些按钮和处理程序的工具栏。当用户单击按钮时,会显示一些对话框。但是,即使在Windows7上,这些对话框也有带有矩形按钮的过时的Windows98外观 我知道您需要一个清单文件来启用主题化,但此加载项是使用Visual Studio 2008创建的,它会自动添加清单,如下所示: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assemb

我有一个Office2007的加载项,它为OnClick事件添加了一个带有一些按钮和处理程序的工具栏。当用户单击按钮时,会显示一些对话框。但是,即使在Windows7上,这些对话框也有带有矩形按钮的过时的Windows98外观

我知道您需要一个清单文件来启用主题化,但此加载项是使用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外观,我应该做哪些更改?
我读过关于隔离意识的文章,但这似乎也不起作用。

正如您所发现的,添加清单只是战斗的一半。在创建任何控件之前,还需要在外接程序初始化时调用。这是为您使用的常用控件注册窗口类所必需的

为了防止您对文档产生怀疑,微软的雷蒙德·陈(Raymond Chen)不久前发布了一篇文章,正是针对这个问题


如果您有任何其他问题,请查看本文:

正如您所发现的,添加清单只是战斗的一半。在创建任何控件之前,还需要在外接程序初始化时调用。这是为您使用的常用控件注册窗口类所必需的

为了防止您对文档产生怀疑,微软的雷蒙德·陈(Raymond Chen)不久前发布了一篇文章,正是针对这个问题


如果您还有其他问题,请查看本文:

我在addin类的构造函数中添加了InitCommonControlsEx,但似乎没有任何效果。我做错什么了吗?CConnect::CConnect{INITCOMMONCONTROLSEX initcommctrl={sizeofinitcommctrl,0xFFFFFF};INITCOMMONCONTROLSEX&initcommctrl;MessageBox0,0,0;}此处显示的MessageBox没有主题。我还将定义隔离\u感知\u启用的1添加到stdafx的顶部,但仍然不走运。我刚刚意识到INITCOMMONCONTROLSEX无法返回FALSE,但在谷歌上快速搜索一个论坛帖子,解释问题确实来自清单,我应该将这个pragma添加到我的代码中:pragma commentlinker,/manifestdependency:\type='win32'name='Microsoft.Windows.Common Controls'version='6.0.0.0'processorArchitecture=publicKeyToken='6595b64144ccf1df'language=\这就解决了问题:事实上,事实证明INITCOMMONCONTROLSEX毕竟是不需要的,可能我的项目中有一些清单文件不正确的地方。不过还是要谢谢你:@satuon:我很高兴你把问题解决了。但我对你的评论表示怀疑,你认为性毕竟是不必要的。事实上,这正好解释了为什么这是必需的,即使它似乎没有它也能工作。谢谢,我补充了InitCommonControlsEx。我假设它是由框架本身调用的,因为一切正常,但当我在它上放置断点时,我看到它没有被调用。还有一个问题-我将ICC_标准_类作为INITCOMMONCONTROLSEX中的标志传递,对吗?我在addin类的构造函数中添加了INITCOMMONCONTROLSEX,但似乎没有任何效果。我做错什么了吗?CConnect::CConnect{INITCOMMONCONTROLSEX initcommctrl={sizeofinitcommctrl,0xFFFFFF};INITCOMMONCONTROLSEX&initcommctrl;MessageBox0,0,0;}此处显示的MessageBox没有主题。我还将定义隔离\u感知\u启用的1添加到stdafx的顶部,但仍然不走运。我刚刚意识到INITCOMMONCONTROLSEX无法返回FALSE,但在谷歌上快速搜索一个论坛帖子,解释问题确实来自清单,我应该将这个pragma添加到我的代码中:pragma commentlinker,/manifestdependency:\type='win32'name='Microsoft.Windows.Common Controls'version='6.0.0.0'processorArchitecture=publicKeyToken='6595b64144ccf1df'language=\这就解决了问题:事实上,事实证明INITCOMMONCONTROLSEX毕竟是不需要的,可能我的项目中有一些清单文件不正确的地方。不过还是要谢谢你:@satuon:我很高兴你把问题解决了。但我对你的评论表示怀疑,你认为性毕竟是不必要的。事实上,这正好解释了为什么这是必需的,即使它似乎没有它也能工作。谢谢,我补充了InitCommonControlsEx。我假设它是由框架本身调用的,因为一切正常,但当我在它上放置断点时,我看到它没有被调用。还有一个问题-我在INITCOMMONCONTROLSEX中将ICC_标准_类作为标志传递,对吗?