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客户机和服务器所 ...
随机推荐
- 我的第二个Python小程序
输出0-100之间的偶数: # Author: fansik # Description: Output an even number between 0 and 100 # method one n ...
- django基本安装
一.web框架 1.什么是web框架? Web框架是一种开发框架,用来支持动态网站.网络应用程序及网络服务的开发.其类型有基于请求的和基于组件的两种框架. 本质上其实就是一个socket服务端,用户的 ...
- [转+整理]linux shell 将字符串分割成数组
原文链接:http://1985wanggang.blog.163.com/blog/static/776383320121745626320/ a="one,two,three,four& ...
- 两张Excel表比较,两个for循环比较优化使用Contains
将一个Excel表中的sheet中的一列导出到List<string>,用一个for循环循环另一张表中的数据,看是否在第一张表中的Contains中
- 标准c内存函数的使用方法
标准c内存函数 calloc 语法: #include <stdlib.h> void *calloc( size_t num, size_t size ); 功能: 函数返回 ...
- 使用C# .NET 将结构数组绑定到 Windows 窗体的方法
本任务的内容 概要 要求 设计结构 向数组添加结构实例 将结构成员绑定到窗体控件 提供浏览数组的方式 分步示例 参考 概要 本文介绍如何向 Windows 窗体绑定结构数组. 该示例由一个 Win ...
- GIS学习和开发的在线资源
1.OpenGIS Consortium标准,http://www.opengeospatial.org.著名的OGC标准是每个GIS开发者最后都不得不学习的,或深或浅. 2.SharpMap,Pro ...
- .ssh中的文件的分别意义
当我们在用户的主目录使用如下命令: cd (进入个人主目录,默认为/home/hadoop) ssh-keygen -t rsa -P '' (注:最后是二个单引号) 表示在用户的主目录创建ssh登陆 ...
- springboot-FilterRegistrationBean
主要用来对servlet filter进行自定义,比如设置order. 先写一个普通的filter: public class FilterDemo implements Filter { priva ...
- crm销售管理系统一
一.环境配置 1.首先配置pip,环境变量配置 pip 9.0.1 from c:\users\administrator\envs\crm\lib\site-packages (python 3.6 ...