vs 2005/2008/2010 ATL ActiveX控件显示XP风格
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
vs 2005/2008/2010 ATL ActiveX控件显示XP风格的更多相关文章
- 利用wtl的CDialogResize自动调整atl ActiveX控件布局
前言 利用atl 开发activex控件时,如果使用atl复合控件时,acitvex控件上的界面元素不会自动改变大小,如果自己在OnSize中处理每个子控件的布局是一件非常麻烦的事,我们可以借助wtl ...
- C#编写ActiveX控件
用C#编写ActiveX控件 http://www.cnblogs.com/homer/archive/2005/01/04/86473.html http://www.cnblogs.com/hom ...
- ActiveX控件资料
Visual Studio 2008(c#)开发ActiveX控件及制作CAB包总结(1) 分类: C#2011-05-27 15:50 403人阅读 评论(0) 收藏 举报 c#stringhook ...
- 发布MFC ActiveX控件并实现自动更新
一. 引言 上一篇我们讲了如何使用 VC 2005来开发 MFC ActiveX控件,我们开发 ActiveX控件最终目的是将 ActiveX控件发布出来并嵌入在 Web网页中,随着控件 ...
- 用C#编写ActiveX控件,开发浏览器控件,注册ActiveX 控件
用C#编写ActiveX控件,开发浏览器控件,注册ActiveX 控件用C#编写ActiveX控件 开发浏览器控件这是本控件开发完成后的一个简单应用.我们可以利用它以本地文件夹为单位来批量更新服务器的 ...
- 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 实现连接点 ...
- ATL开发 ActiveX控件的 inf文件模板
ATL开发 ActiveX控件的 inf文件模板
- 如何用ATL创建ActiveX控件
演示截图: 代码简介或代码解析: 如何用ATL创建ActiveX控件 实现了一个ActiveX控件,它在一个圆内部有个正多边形,当用户在多变形内部单击将会使多边形的边数在当前的基础上+1,在多变形外部 ...
- 用ATL和MFC来创建ActiveX控件
摘要:目前MFC和ATL代表了两种框架,分别面向不同类型的基于Windows的开发.MFC代表了创建独立的Windows应用的一种简单.一致的方法:ATL提供了一种框架来实现创建COM客户机和服务器所 ...
随机推荐
- 007-sql整体概述
一.概述 sql基础:数据库.数据表.行.列.关系 查询: Select 字段1,字段2,* from 表 where 条件 去除重复:Distinct 必须放在所有列前面 区间语句:BETWEEN ...
- 002-基本业务搭建【日志,工具类dbutils,dbcp等使用】
一.需求分析 1.1.概述 1.用户进入“客户管理”,通过列表方式查看用户: 2.客户名称,模糊查询用户列表 3.客户名称,可查看客户详细信息 4.新增.编辑.删除功能等 二.系统设计 需要对原始需求 ...
- Facebook支持python的开源预测工具Prophet
Facebook 宣布开源一款基于 Python 和 R 语言的数据预测工具――“Prophet”,即“先知”.取名倒是非常直白. Facebook 表示,Prophet 相比现有预测工具更加人性化, ...
- 如何用好 Google 等搜索引擎
1: 双引号短语搜索2: 减号减号前面必须是空格,减号后面没有空格,紧跟着需要排除的词例如:搜索 -引擎返回的则是包含“搜索”这个词,却不包含“引擎”这个词的结果3: 星号RE,通配符4: intit ...
- 值得关注的10个Python语言学习博客
大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建立这个博客的原因,向大家分享我自己学到的新知识.今天我向大家推荐10个值得我们关注 ...
- MFC输出调试信息
刚学mfc时只知道用MessageBox输出,可是MessageBox只能输出字符串, 对于习惯于printf的我来说非常不便,后来查了一下mfc可以像printf一样输出, 就是TRACE这个宏,用 ...
- HTML学习笔记(上)
1. HTML介绍 1.1 什么是HTML HyperText Markup Language,超文本标记语言.简单来说,HTML文件本质上就是一个文本文件,但是这个文本文件是带有标签的. 不同的标签 ...
- vi高级命令集锦
.交换两个字符位置 xp .上下两行调换 ddp .把文件内容反转 :g/^/m0/ (未通过) .上下两行合并 J .删除所有行 dG .从当前位置删除到行尾 d$ .从当前位置复制到行尾 y$ 如 ...
- copy deepcopy辨析
copy deepcopy讲的是复制源对象的改变对copy出来的对象的影响: 我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在. 所以改变原有被复制对象不会对已经复制 ...
- linux下的cacti安装(centos7)
1 cacti运行环境准备 cacti需要php+apache+mysql+snmp+RRDTool,以及cacti本身.cacti本体是用php开发的网站,通过snmp对远端设备信息进行采集.apa ...