2011年8月8日

Using GDI+ with MFC

MFC 只提供 GDI 繪圖系統,想要有現代與流行的畫面,最快最簡單的方法,就是加入 GDI+。雖然在名稱上,只多了一個 + 號,但增加的功能卻不少。
這些功能有漸層筆刷 (Gradient Brushes)、透明混色 (Alpha Blending)、曲線 (Cardinal Splines & Bezier Splines)、平面座標轉換 (Transformations and the Matrix Object)、Scalable Regions 以及支援了更多的圖檔格式 (bmp, gif, jpeg, png, tiff, icon, exif, wmf, emf)。此外,還有 GraphicsPath 可以利用線、矩形、橢圓、曲線、文字..等元素,來產生向量資訊。
要在 MFC 上使用 GDI+ 的步驟如下:
  1. 至微軟 MSDN下載 Windows Platform SDK
  2. 建立 MFC 專案,並設定 include 與 lib 等相關連結
  3. 在 stdafx.h 加入下列程式碼
    #include <gdiplus.h>
    using namespace Gdiplus;
    #pragma comment(lib, "gdiplus.lib")
    
  4. 在繼承 CwinApp 的子物件中,加入下列變數的宣告
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    
  5. 在 InitInstance() 加入
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    
  6. 最後在 ExitInstance() 加入
    GdiplusShutdown(gdiplusToken);
    
完成後,便可以開始使用GDI+了,下列的程式碼,是使用 GDI+ 的範例:
void CTestGDIPlusView::OnDraw(CDC* pDC)
{
	CTestGDIPlusDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	Pen myPen(Color(255, 255, 0, 0), 3);
	Graphics myGraphics(pDC->m_hDC);

	myGraphics.DrawLine(&myPen, 20, 10, 200, 100);
}

最後,還有一個問題必須特別注意:MFC 在 debug 下,為了 memory leak 與錯誤行號的顯示,會在每個 cpp 檔案開頭,利用下列程式,將 new 宣告為 DEBUG_NEW。
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
因此 Graphics 物件若是以 new 產生,會發生 C2660 的錯誤訊息。解決辦法是將這段程式刪除,或直接修改 GdiplusBase 程式。方法請參考微軟的網站 PRB: Microsoft Foundation Classes DEBUG_NEW Does Not Work with GDI+
[Reference]
Using GDI+
Using GDI+ with MFC or native C/C++

沒有留言:

Deploying Vue & .NET with Google OAuth on GCP Cloud Run

Deploying Vue & .NET with Google OAuth on GCP Cloud Run Deploying Vue & .NET with Google OAuth on GCP Cloud Run...