知識點1: HWND CWnd的關聯
從HWND 關聯到CWnd *
1CWnd * cwnd;
2HWND hwnd;
3cwnd = CWnd::FromHandle(hwnd); //實現視窗控制代碼和MFC視窗類別的關聯
4//cwnd->Attach(hwnd);
問題存在於第三行和第四行的兩種關聯方法,My Code中,用第三行的方法可以正確運行,但是用第四行的方法就會有警告說wnd未初始化,運行代碼出現crash。
方法參考:
http://www.cppblog.com/weiwang1133/archive/2008/09/17/62097.aspx
http://topic.csdn.net/t/20050118/16/3735215.html
知識點2:CBrush類的使用
Code
1CDC * pDC = new CClientDC(wnd); //定義並初始化CDC 指標對象
2
3CBrush brush; //定義畫刷
4brush.CreateSolidBrush(RGB(0,255,0)); //調用CreateSolidBrush建立實心綠色畫刷
5CBrush *pOldBrush = pDC->SelectObject(&brush); //將畫刷載入CDC對象中
6
7pDC->Rectangle(50,50,200,200); //調用Rectangle畫實心綠色矩形
8pDC->SelectObject(pOldBrush); //恢複原來的畫刷。 這一步不是很明白,有待進一步學習
9delete pDC; //手動釋放對象
畫矩形部分放在WM_PAINT訊息中,定義部分放在視窗進程的開始。再次暴露我的基礎不紮實,之前一直把定義部分也放在訊息選擇的switch中,這是錯誤的。
---------------------------------------------
位元影像畫刷
和之前畫刷不同在於需要調用CreatePatternBrush初始化畫刷。
BOOL CreatePatternBrush(CBitmap *pBitmap)
學習一個新的位元影像類CBitmap,調用CreateBigmap方法初始化位元影像對象,傳遞給位元影像畫刷。之後畫圖的部分基本沒有差別。
Define bitmap brush
1//create bitmap
2CBitmap bm;
3DWORD colorBits[8] = {0x44,0x33,0x22,0x11,0x11,0x22,0x33,0x44};
4bm.CreateBitmap(8,8,1,1,colorBits);
5
6//define brush
7CBrush mbrush;
8mbrush.CreatePatternBrush(&bm);
9
10CBrush *mOldBrush = mDC->SelectObject(&mbrush);
畫圖的部分依然放在WM_PAIINT事件體中,這次畫的是圓角矩形,使用RoundRect方法,用CRect結構體定義和螢幕的間距,用CPoint結構體定義圓角的直徑
paint round rectangle
1//Paint bitmap brush
2mDC->RoundRect(CRect(20,20,200,200),CPoint(10,10));
3mDC->SelectObject(mOldBrush);
4
5//delete object
6bm.DeleteObject();
7mbrush.DeleteObject();
8mOldBrush = NULL;
9delete mDC;
10mDC = NULL;
第八行將畫刷指標指向空是我自己加的,書上的代碼沒有管這個用來指向原始畫刷的指標。不知道這樣算不算畫蛇添足。