Office COM 추가 기능에 Windows XP 테마를 적용하는 방법

요약

Microsoft Visio와 같은 Microsoft Office 프로그램용 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 웹 사이트를 참조하십시오.맨 위로



Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.
속성

문서 ID: 830033 - 마지막 검토: 2008. 11. 13. - 수정: 1

피드백