GDI+在ActiveX Controls中的启用和停止

翻译 2007年09月13日 13:04:00
  
在ActiveX中使用GDI+和在其它应用程序中使用基本上是相同的,但是有一个非常重要的不同就是启动和停止GDI+的问题。在一个window应用程序中,我们一般在程序开始时启用GDI+,在程序退出时停止它。这样的方法在ActiveX中并不适用,会出现多次加载的情况。在我的测试中,如果GDI+在继承了COleControl类的构造函数中调用,在析构函数中停止,那么每次都是好用的。
下面的程序直接写了一个类来完成GDI+的启用和停止,它确保在每个进程中只调用一次Gdiplus::GdiplusStartup。
class InitGDIPlus {
private:
    HANDLE                       m_hMap;
    bool                         m_bInited, m_bInitCtorDtor;
    ULONG_PTR                    m_gdiplusToken;
    Gdiplus::GdiplusStartupInput m_gdiplusStartupInput;
    long                         m_initcount;
 
public:
    // Constructor offers the ability to initialize on construction, or delay until needed.
    InitGDIPlus(bool bInitCtorDtor = false) : m_bInitCtorDtor(bInitCtorDtor),
                m_bInited(false), m_hMap(NULL), m_gdiplusToken(NULL),
                m_gdiplusStartupInput(NULL), m_initcount(0) 
    {
        if (m_bInitCtorDtor) {
            Initialize();
        }
    }
 
    // If GDI+ has not been explicitly Deinitialized, do it in the destructor
    virtual ~InitGDIPlus() {
        if (m_bInitCtorDtor) {
            Deinitialize();
        }
    }
 
   
//这个函数基于当前的进程创建一个文件映射,如果映射已经存在我们就知道这个类已经启用
//GDI+了,不过不存在,则启用它
    void Initialize() {
        if (!m_bInited) {
            char buffer[1024];
            sprintf(buffer, "GDIPlusInitID=%x", GetCurrentProcessId());
            m_hMap = CreateFileMapping((HANDLE) INVALID_HANDLE_VALUE, NULL,
                PAGE_READWRITE | SEC_COMMIT, 0, sizeof(long), buffer);
               
            if (m_hMap != NULL) {
                // We might have a winner
                if (GetLastError() == ERROR_ALREADY_EXISTS) {
                    CloseHandle(m_hMap);
                } else {
                    // Yes, we have a winner
                    m_bInited = true;
                    Gdiplus::GdiplusStartup(&m_gdiplusToken,
                        &m_gdiplusStartupInput, NULL);
                    TRACE("Inited GDIPlus/n");
                }
            }
        }
        m_initcount++;
    }
//这个函数没有任何窍门,如果类已经启用的GDI+,那么在初始化次数达到0时才能被关闭
    void Deinitialize()
    {
        m_initcount--;
        if (m_bInited && m_initcount == 0) {
            TRACE("GDIPlus shutdown/n");
            Gdiplus::GdiplusShutdown(m_gdiplusToken);
            CloseHandle(m_hMap);
            m_bInited = false;
        }
    }
};
 
static InitGDIPlus GDI_Plus_Controler;
CGDIPlusControlCtrl::CGDIPlusControlCtrl() : m_isClicked(false), m_center(50, 50)
{
    InitializeIIDs(&IID_DGDIPlusControl, &IID_DGDIPlusControlEvents);
 
    GDI_Plus_Controler.Initialize(); //GDI_Plus_Controler 为静态全局变量
}
 
 
/////////////////////////////////////////////////////////////////////////////
// CGDIPlusControlCtrl::~CGDIPlusControlCtrl - Destructor
 
CGDIPlusControlCtrl::~CGDIPlusControlCtrl()
{
    GDI_Plus_Controler.Deinitialize(); //GDI_Plus_Controler为静态全局变量
}

解决Visual C++无法使用ActiveX 控件,Gallery目录下没有Registered ActiveX Controls问题

问题描述: 在阅读《深入浅出Visual-C++串口编程》时。书中P27内容如下 Visual C++为我们提供了一种好用的 ActiveX 控件 Microsoft Communications C...
  • h532600610
  • h532600610
  • 2016年07月04日 20:00
  • 2346

loadrunner8中识别ActiveX、Scripe、Java Applets

测试Client端动态页面中嵌入ActiveX、Scripe、Java Applets时,在运行后的结果页面中经常会出现类似“无法下载ActiveX”的错误。按照以下步骤来操作可以解决该问题。 1、V...
  • ryo2007
  • ryo2007
  • 2008年02月02日 11:37
  • 227

关于VC++6.0中,MSDev89\Gallery 文件夹为空的问题

在 Win7上装了 VC++6.0 ,想要在创建的工程中添加 Windows 多媒体库支持,单击菜单中的 Project --》Add to Project --》Components and Con...
  • wangwenjing90
  • wangwenjing90
  • 2013年04月25日 17:09
  • 8007

IE的安全设置中设成“启用,运行,下载activeX控件”程序控制的实现的原理

(1)IE的安全属性设置是放置在注册表的以下位置的: HKEY_USERS\UserName\Software\Microsoft\Windows\CurrentVersion\Internet S...
  • a597926661
  • a597926661
  • 2012年08月20日 17:13
  • 2708

修改注册表添加IE信任站点及启用Activex控件方法

主要是注册表中的两项: HKEY_CURRENT_USER\Software\microsoft\Windows\CurrentVersion\Internet Settings\Zonemap  记...
  • worldoom2012
  • worldoom2012
  • 2016年05月30日 16:08
  • 3442

去掉IE提示:internet explorer 已限制此网页运行脚本或Activex控件

运行加载OCX控件的HTML文件,显示提示如下图:   解决方法是在HTML文件中添加一行注释代码,如下图:   就是红色框内的代码。即:...
  • tao_duanzhi
  • tao_duanzhi
  • 2018年01月23日 10:43
  • 54

ActiveX Controls

MSDN上第一句说:ActiveX Controls本质上是一个OLE对象。实现了IUnknown接口。那么,什么是OLE对象()。什么是IUnknown接口(OLE)。...
  • sophistcxf
  • sophistcxf
  • 2012年07月25日 16:41
  • 345

修改注册表实现未签名ActiveX控件自动安装

前段时间做了一个嵌入式的web,由于有些页面中加载了公司另一个同事做的ActiveX控件,所以在初次访问页面的时候,IE需要做好些地方的改动。于是周围有同事就有不断抱怨,说设置太麻烦了,自己感觉也是,...
  • u013256831
  • u013256831
  • 2014年08月29日 22:04
  • 2638

IE配置注册表对应值,WebBrowser中启用禁用ActiveX

注意:除非另外声明,否则每个 DWORD 值等于 0、1 或 3。通常,设置为 0 则将具体操作设置为允许;设置为 1 则导致出现提示;设置为 3 则禁止执行具体操作。 值       设置 --...
  • zengxin2008
  • zengxin2008
  • 2012年09月27日 09:50
  • 3116

Forms Controls and ActiveX Controls in Excel

Quoted from: http://peltiertech.com/WordPress/forms-controls-and-activex-controls-in-excel/ There ar...
  • wengene
  • wengene
  • 2010年04月02日 17:30
  • 770
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GDI+在ActiveX Controls中的启用和停止
举报原因:
原因补充:

(最多只允许输入30个字)