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++

2011年8月7日

Unicode in MFC CString

告別 MFC 大概有 10 年以上的時間,因為工作,得重新溫習這套平台。用慣了 C# 之後,回過來使用MFC,老覺得 "卡卡的",很不順手。
十年前,unicode 還不是很普及,在字串轉換上,常使用 (ch & 0x80) 來檢查是不是中文字;但是現在已經有很多函式可以支援,我利用下列簡單的程式碼,將字串的轉換記錄下來,免得下回忘了,又得重新詢一次。

 
int len = str.GetLength();
for (int i=0; i<len; i++)
{
	TCHAR ch = str[i];

	TCHAR buffer[255];
	_stprintf_s(buffer, 255, _T("Index:%d Char:%c"), i, ch);

	CString strf;
	strf.Format(_T("Index:%d Char:%c"), i, ch);
}
一些常用的字串函式,如 strcat, strcpy, strcmp,..等,都可以找到對應的 _tcscat, _tcscpy, _tcscmp, 透過 tchar.h 便可以不必擔心是不是在 unicode 的編譯環境下了。
[reference]
CString: http://www.flounder.com/cstring.htm

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...