天天看點

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

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

繼續閱讀