在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為靜态全局變量 }