vs 2005/2008/2010 ATL ActiveX控件在IE浏览器中控件显示的是原始的风格,要显示XP风格只要进行以下操作

一、在Stdafx.h中增加下以内容

#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif

二、增加CXPStyleAC类

//XPStyleAC.h

#pragma once

class CXPStyleAC
{
protected:
CXPStyleAC(void); public:
~CXPStyleAC(void); public:
static CXPStyleAC* Instance(); BOOL CreateAc();
void DestoryAc(); BOOL ActivateAc();
BOOL DeactiveAc(); private:
HANDLE m_hActAc;
ULONG_PTR m_ulAcCookie;
};
//XPStyleAC.cpp

#include "StdAfx.h"
#include "XPStyleAC.h" CXPStyleAC::CXPStyleAC(void) : m_hActAc(INVALID_HANDLE_VALUE), m_ulAcCookie()
{
} CXPStyleAC::~CXPStyleAC(void)
{
} CXPStyleAC* CXPStyleAC::Instance()
{
static CXPStyleAC oXpStyleAc; return &oXpStyleAc;
} BOOL CXPStyleAC::CreateAc()
{
ATLASSERT(INVALID_HANDLE_VALUE == m_hActAc); BOOL bRet = FALSE;
static int s_nModule = ;
MEMORY_BASIC_INFORMATION mbi;
::VirtualQuery(&s_nModule, &mbi, sizeof(mbi)); TCHAR szModule[MAX_PATH];
int n = ::GetModuleFileName((HMODULE)mbi.AllocationBase, szModule, MAX_PATH);
ATLENSURE(n > ); if (n > )
{
// Set up the activation context structure
ACTCTX actctx;
memset(&actctx, , sizeof(actctx));
actctx.cbSize = sizeof(actctx);
actctx.hModule = (HMODULE)mbi.AllocationBase;
actctx.lpSource = szModule;
actctx.lpResourceName = ISOLATIONAWARE_MANIFEST_RESOURCE_ID;
actctx.dwFlags = ACTCTX_FLAG_HMODULE_VALID | ACTCTX_FLAG_RESOURCE_NAME_VALID; // Create the activation context
m_hActAc = CreateActCtx(&actctx);
ATLASSERT(INVALID_HANDLE_VALUE != m_hActAc); if (m_hActAc != INVALID_HANDLE_VALUE)
{
bRet = TRUE;
}
} return bRet;
} void CXPStyleAC::DestoryAc()
{
if (m_hActAc != INVALID_HANDLE_VALUE)
{
ReleaseActCtx(m_hActAc);
m_hActAc = INVALID_HANDLE_VALUE;
}
} BOOL CXPStyleAC::ActivateAc()
{
BOOL bRet = FALSE; if (m_hActAc != INVALID_HANDLE_VALUE)
{
bRet = ActivateActCtx(m_hActAc, &m_ulAcCookie);
ATLASSERT(bRet);
} return bRet;
} BOOL CXPStyleAC::DeactiveAc()
{
BOOL bRet = FALSE; if (m_hActAc != INVALID_HANDLE_VALUE && m_ulAcCookie != )
{
bRet = DeactivateActCtx(, m_ulAcCookie);
ATLASSERT(bRet);
} return bRet;
}

三、在dllmain中创建Active context

extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
CXPStyleAC::Instance()->CreateAc();
}
else if (dwReason == DLL_PROCESS_DETACH)
{
CXPStyleAC::Instance()->DestoryAc();
} return _AtlModule.DllMain(dwReason, lpReserved);
}

四、重写CComCompositeControl的CreateControlWindow方法,在创建控件前激活context

// CTestXpStyle
class ATL_NO_VTABLE CTestXpStyle :
public CComObjectRootEx<CComSingleThreadModel>,
public CStockPropImpl<CTestXpStyle, ITestXpStyle>,
public IOleControlImpl<CTestXpStyle>,
public IOleObjectImpl<CTestXpStyle>,
public IOleInPlaceActiveObjectImpl<CTestXpStyle>,
public IViewObjectExImpl<CTestXpStyle>,
public IOleInPlaceObjectWindowlessImpl<CTestXpStyle>,
public ISupportErrorInfo,
public IObjectWithSiteImpl<CTestXpStyle>,
public IQuickActivateImpl<CTestXpStyle>,
#ifndef _WIN32_WCE
public IDataObjectImpl<CTestXpStyle>,
#endif
public IProvideClassInfo2Impl<&CLSID_TestXpStyle, NULL, &LIBID_xpstyleLib>,
public IObjectSafetyImpl<CTestXpStyle, INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
public CComCoClass<CTestXpStyle, &CLSID_TestXpStyle>,
public CComCompositeControl<CTestXpStyle>
{
public: CTestXpStyle()
{
m_bWindowOnly = TRUE;
CalcExtent(m_sizeExtent);
} //................................ HRESULT FinalConstruct()
{
return S_OK;
} void FinalRelease()
{
} virtual HWND CreateControlWindow( HWND hWndParent, RECT& rcPos)
{
CXPStyleAC::Instance()->ActivateAc();
HWND h = __super::CreateControlWindow(hWndParent, rcPos);
CXPStyleAC::Instance()->DeactiveAc();
return h;
}
};

五、编译运行,大功告成

六、参考资料

  http://support.microsoft.com/kb/830033/zh-cn

  http://blogs.msdn.com/b/junfeng/archive/2006/03/19/sxs-activation-context-activate-and-deactivate.aspx?Redirected=true

vs 2005/2008/2010 ATL ActiveX控件显示XP风格的更多相关文章

  1. 利用wtl的CDialogResize自动调整atl ActiveX控件布局

    前言 利用atl 开发activex控件时,如果使用atl复合控件时,acitvex控件上的界面元素不会自动改变大小,如果自己在OnSize中处理每个子控件的布局是一件非常麻烦的事,我们可以借助wtl ...

  2. C#编写ActiveX控件

    用C#编写ActiveX控件 http://www.cnblogs.com/homer/archive/2005/01/04/86473.html http://www.cnblogs.com/hom ...

  3. ActiveX控件资料

    Visual Studio 2008(c#)开发ActiveX控件及制作CAB包总结(1) 分类: C#2011-05-27 15:50 403人阅读 评论(0) 收藏 举报 c#stringhook ...

  4. 发布MFC ActiveX控件并实现自动更新

    一.        引言 上一篇我们讲了如何使用 VC 2005来开发 MFC ActiveX控件,我们开发 ActiveX控件最终目的是将 ActiveX控件发布出来并嵌入在 Web网页中,随着控件 ...

  5. 用C#编写ActiveX控件,开发浏览器控件,注册ActiveX 控件

    用C#编写ActiveX控件,开发浏览器控件,注册ActiveX 控件用C#编写ActiveX控件 开发浏览器控件这是本控件开发完成后的一个简单应用.我们可以利用它以本地文件夹为单位来批量更新服务器的 ...

  6. ActiveX控件(ATL篇)

    目录 第1章 VC++6.0创建    2 1.1 目标    2 1.2 创建项目    2 1.3 增加COM类    4 1.4 属性    7 1.5 事件    8 1.6 实现连接点    ...

  7. ATL开发 ActiveX控件的 inf文件模板

    ATL开发 ActiveX控件的 inf文件模板    

  8. 如何用ATL创建ActiveX控件

    演示截图: 代码简介或代码解析: 如何用ATL创建ActiveX控件 实现了一个ActiveX控件,它在一个圆内部有个正多边形,当用户在多变形内部单击将会使多边形的边数在当前的基础上+1,在多变形外部 ...

  9. 用ATL和MFC来创建ActiveX控件

    摘要:目前MFC和ATL代表了两种框架,分别面向不同类型的基于Windows的开发.MFC代表了创建独立的Windows应用的一种简单.一致的方法:ATL提供了一种框架来实现创建COM客户机和服务器所 ...

随机推荐

  1. nodejs get请求

    const http = require('http'); http.get('http://192.168.1.6:8080/getDemo?msg=12', (res) => { const ...

  2. Android 4.4 Kitkat 音频实现及简要分析

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jingxia2008/article/details/26701899 在 Android 4.4 ...

  3. corethink功能模块探索开发(二)让这个模块可安装

    要想让这个模块可安装,只需要在opcmf.php文件中写一些配置数据就行 随便写点 Equip/opencmf.php <?php // 模块信息配置 return array( // 模块信息 ...

  4. C语言预处理命令的使用

    cppreference.com -> 预处理命令 -> 详细说明 预处理命令 #,## # 和 ## 操作符是和#define宏使用的. 使用# 使在#后的首个参数返回为一个带引号的字符 ...

  5. range开始节点和结束节点

    sc = range.startContainer, so = range.startOffsest ec = range.endContainer, eo=range.endOffset   sta ...

  6. PAT 天梯赛 L1-037. A除以B 【水】

    题目链接 https://www.patest.cn/contests/gplt/L1-037 AC代码 #include <iostream> #include <cstdio&g ...

  7. 【Head First Servlets and JSP】笔记5:HttpServletResponse resp

    [HttpServletResponse resp] [由servlet处理响应] 1.一般可以用通过resp获得一个输出流(writer),然后通过输出流将HTML写入响应.例如: resp.set ...

  8. 一言(ヒトコト)Hitokoto API

    『想要成为无论多么悲伤的时候,也能够漂亮微笑的人吧.』 Hitokoto API 更新:2014.02.22 问题/反馈:api # hitokoto.us 数据获取:[ 数据获取 ] 调用举例:[  ...

  9. VCFtools

    The C++ executable module examples This page provides usage examples for the executable module. Exte ...

  10. 【bzoj2151】种树(堆/优先队列+双向链表)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 这道题因为优先队列不怎么会用,而且手写堆的代码也不长,也想复习一下手写堆的写法…… ...