如何将 Windows XP 主题应用于 Office COM 加载项

针对 Office 2003 的支持已终止

Microsoft 已于 2014 年 4 月 8 日终止了针对 Office 2003 的支持。该更改已影响到您的软件更新和安全选项。 了解这一措施对于您的含义以及如何继续保持受保护状态。

概要
在为某一 Microsoft Office 程序(如 Microsoft Visio)创建 COM 加载项时,默认情况下该加载项的外观将符合标准的 Office 外观。但是,使用 Microsoft Windows XP,可以从许多视觉样式(或主题)中进行选择以自定义 Microsoft Windows 程序的外观。

除非对 COM 加载项显式启用了 Windows 主题,否则加载项的外观不会随这些配色方案更改,从而导致该加载项显示为过期或与包含它的程序不同步。使用 Microsoft Visual C++ 或 Microsoft Visual Studio .NET 语言,可以使 COM 加载项能够选择应用 Windows 主题。

如果为 Windows 主题启用某一加载项,则该主题仅影响该加载项的外观,而不影响加载项的功能。

返回页首

免责声明

Microsoft 提供的编程示例只用于说明目的,不附带任何明示或默示的保证。这包括但不限于对适销性或特定用途适用性的默示保证。本文假定您熟悉所演示的编程语言和用于创建和调试过程的工具。Microsoft 的支持工程师可以帮助解释某个特定过程的功能,但是他们不会修改这些示例以提供额外的功能或构建过程以满足您的特殊需求。返回页首

Microsoft Visual Basic 6.0

Visual Basic 6.0 不支持主题。无法使用 Visual Basic 6.0 对加载项应用主题。

返回页首

Microsoft Visual C++ 6.0

要使用 Visual C++ 6.0 使 COM 加载项能够选择应用 Windows XP 主题,请按照下列步骤操作:
  1. 创建一个包含以下信息的清单文件。为特定加载项自定义该信息:
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">   <noInherit/>  <assemblyIdentity    processorArchitecture="*"    type="win32"    name="MyOfficeNetAddin"   version="1.0.0.0"/>   <description>My Office Addin built with .Net</description>    <dependency optional="yes">                                  <dependentAssembly>                        <assemblyIdentity                       type="win32"                      name="Microsoft.Windows.Common-Controls"       version="6.0.1.0"                 publicKeyToken="6595b64144ccf1df"       language="*"                      processorArchitecture="*"/>    </dependentAssembly>                     </dependency>                              </assembly>
  2. 执行以下操作之一:
    • 包含以下预处理器指令:
      #define ISOLATION_AWARE_ENABLED
    • 使用以下代码编译:
      /D ISOLATION_AWARE_ENABLED
  3. 将该清单文件添加到资源文件中,如以下示例所示:
    #include "windows.h"ISOLATIONAWARE_MANIFEST_RESOURCE_ID RT_MANIFEST "mydllname.dl.manifest"
返回页首

Microsoft Visual Studio .NET 和托管语言

要使用 Visual Studio .NET 和 .NET Framework 为 COM 加载项启用 Windows XP 主题,请按照下列步骤操作。

注意:在此例中,使用 C# 在 Windows 窗体上启用应用了主题的激活上下文。此外,为了能够为按钮、复选框、单选按钮和分组框启用 Windows 主题,这些对象的 FlatStyle 属性必须设置为 System
  1. 在 .cs 文件中包含以下信息。为特定加载项自定义该信息:
    using System.Runtime.InteropServices;using System;using System.Security;using System.Security.Permissions;using System.Collections;using System.IO;using System.Text;using System.Windows.Forms;namespace MyOfficeNetAddin{    /// <devdoc>    ///     This class is intended to use with the C# 'using' statement in    ///     to activate an activation context for turning on visual theming at    ///     the beginning of a scope, and have it automatically deactivated    ///     when the scope is exited.    /// </devdoc>[ SuppressUnmanagedCodeSecurity ]internal class EnableThemingInScope : IDisposable{   // Private data	  private uint  cookie;   private static ACTCTX enableThemingActivationContext;   private static IntPtr hActCtx;   private static bool contextCreationSucceeded = false;   public EnableThemingInScope(bool enable)   {   cookie = 0;   if (enable && OSFeature.Feature.IsPresent(OSFeature.Themes))   {    if (EnsureActivateContextCreated())    {     if (!ActivateActCtx(hActCtx, out cookie))     {         // Be sure cookie always zero if activation failed         cookie = 0;     }    }   }  }  ~EnableThemingInScope()  {   Dispose(false);  }  void IDisposable.Dispose()  {   Dispose(true);  }  private void Dispose(bool disposing)  {   if (cookie != 0)   {    if (DeactivateActCtx(0, cookie))    {       // deactivation succeeded...       cookie = 0;    }   }  }  private bool EnsureActivateContextCreated()  {   lock (typeof(EnableThemingInScope))   {    if (!contextCreationSucceeded)    {     // Pull manifest from the .NET Framework install     // directory     string assemblyLoc = null;                             FileIOPermission fiop = new FileIOPermission(PermissionState.None);     fiop.AllFiles = FileIOPermissionAccess.PathDiscovery;     fiop.Assert();     try     {      assemblyLoc = typeof(Object).Assembly.Location;     }     finally     {       CodeAccessPermission.RevertAssert();     }     string manifestLoc = null;     string installDir = null;     if (assemblyLoc != null)     {      installDir = Path.GetDirectoryName(assemblyLoc);      const string manifestName = "XPThemes.manifest";      manifestLoc = Path.Combine(installDir, manifestName);     }     if (manifestLoc != null && installDir != null)     {      enableThemingActivationContext = new ACTCTX();      enableThemingActivationContext.cbSize = Marshal.SizeOf(typeof(ACTCTX));	     enableThemingActivationContext.lpSource = manifestLoc;      // Set the lpAssemblyDirectory to the install      // directory to prevent Win32 Side by Side from      // looking for comctl32 in the application      // directory, which could cause a bogus dll to be      // placed there and open a security hole.	     enableThemingActivationContext.lpAssemblyDirectory = installDir;	     enableThemingActivationContext.dwFlags = ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID;  	     // Note this will fail gracefully if file specified      // by manifestLoc doesn't exist.      hActCtx = CreateActCtx(ref enableThemingActivationContext);      contextCreationSucceeded = (hActCtx != new IntPtr(-1));     }    }    // If we return false, we'll try again on the next call into    // EnsureActivateContextCreated(), which is fine.    return contextCreationSucceeded;   }  }  // All the pinvoke goo...  [DllImport("Kernel32.dll")]  private extern static IntPtr CreateActCtx(ref ACTCTX actctx);  [DllImport("Kernel32.dll")]  private extern static bool ActivateActCtx(IntPtr hActCtx, out uint lpCookie);  [DllImport("Kernel32.dll")]  private extern static bool DeactivateActCtx(uint dwFlags, uint lpCookie);  private const int ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID = 0x004;              private struct ACTCTX   {   public int       cbSize;   public uint      dwFlags;   public string    lpSource;   public ushort    wProcessorArchitecture;   public ushort    wLangId;   public string    lpAssemblyDirectory;   public string    lpResourceName;   public string    lpApplicationName;  } }}
  2. 使用以下包装创建窗体。此过程将在创建任何控件之前推送应用了主题的激活上下文:
    using( new EnableThemingInScope( true ) ){ Form1 form1 = new Form1(); form1.CreateControl();}
返回页首
参考
有关使用 Windows XP 视觉样式(主题)的更多信息,请访问下面的 Microsoft MSDN 网站:返回页首
属性

文章 ID:830033 - 上次审阅时间:01/11/2006 06:53:09 - 修订版本: 5.5

Microsoft Office 2003, All Editions, Microsoft Office Access 2003, Microsoft Office Excel 2003, Microsoft Office FrontPage 2003, Microsoft Office Outlook 2003, Microsoft Office PowerPoint 2003, Microsoft Office Project Professional 2003, Microsoft Office Project Standard 2003, Microsoft Office Publisher 2003, Microsoft Office Visio Standard 2003, Microsoft Office Visio Professional 2003, Microsoft Office Word 2003

  • kbprogramming kbcode kbhowtomaster KB830033
反馈