二、繪製線條
1、利用SDK全域函數實現畫線功能
HDC hdc;
hdc=::GetDC(m_hWnd);
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);
註:為了進行畫圖操作,必須獲得一個裝置描述表DC;在完成繪圖操作後,一定要釋放裝置描述表資源
2、利用MFC的CDC類實現畫線功能
CDC* pDC=GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
CView::OnLButtonUp(nFlags, point);
註:MFC提供了一個裝置描述表的封裝類CDC,該類封裝了所有與繪圖相關的操作;並提供了一個資料成員m_hDC,
用來儲存與CDC類相關的DC控制代碼
3、利用MFC的CClientDC類實現畫線功能
CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
註:MFC提供了CClientDC類來實現繪圖操作,該類繼承於CDC類;在構造時調用GetDC函數,在析構時調用Release
函數;在構造CClientDC對象時,需要一個CWnd類型的指標參數,傳遞this表示視類視窗,傳遞GetParent()表示
架構視窗
4、利用MFC的CWindowDC類實現畫線功能
CWindowDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
註:CWindowDC類與CClient類基本相同,區別在於該類可以訪問整個視窗地區,包括架構視窗的客戶區和非客戶區
5、在桌面視窗中畫線
CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
註:CWnd::GetDesktopWindow成員函數可以獲得Windows桌面視窗的控制代碼,從而獲得一個與桌面視窗相關的裝置描
述表,就可以在桌面視窗中繪圖
6、繪製彩色線條
(1)裝置描述表中有一個預設的黑色畫筆
(2)MFC提供了CPen類用於建立畫筆對象,該類封裝了與畫筆相關的操作
(3)當構建一個GDI對象後,該對象並不會立即生效,必須選入裝置描述表,它才會在以後的繪製操作中生效
(4)一般情況下,在完成繪圖操作之後,都要利用SelectObject函數把先前的GDI對象選入裝置描述表,以便使其
恢複到先前的狀態
(5)畫筆的寬度要小於等於1時,虛線線型才有效
(6)實現代碼
CPen pen(PS_SOLID,1,RGB(255,0,0));
CClientDC dc(this);
CPen* pOldPen=dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);
三、使用畫刷繪圖
1、簡單畫刷
(1)MFC提供了CBrush類,用於建立畫刷對象,從而可以填充一塊地區
(2)裝置描述表對象的成員函數FillRect,用於利用指定的畫刷填充一塊指定的矩形地區
(3)實現代碼
CBrush brush(RGB(255,0,0));
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);
2、位元影像畫刷
(1)CBrush類的CBrush(CBitmap* pBitmap)建構函式可以建立一個位元影像畫刷對象
(2)CBitmap類是位元影像類,構建該類對象時,除了要調用建構函式,還要調用LoadBitmap初始化函數
(3)實現代碼
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CBrush brush(&bitmap);
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);
3、透明畫刷
(1)裝置描述表中有一個預設的白色畫刷
(2)GetStockObject函數用於擷取一個白色或黑色的畫刷控制代碼
(3)靜態成員(靜態成員變數和靜態成員函數)屬於類本身,在類載入的時候,即為它們分配了空間,所以可以通過
類名::變數名/函數名來訪問;而執行個體成員屬於對象的資料和方法,也就是應該首先產生類的對象,然後通過類的對
象去引用
(4)在靜態成員函數中不能調用非靜態成員,而只能訪問靜態成員變數
(5)無論採用什麼樣的操作,程式碼都是在記憶體中啟動並執行,只有在記憶體中佔有了一席之地,我們才能夠訪問它。如
果一個成員函數或成員變數還未在記憶體中產生,結果是無法訪問它的
(6)實現代碼
CClientDC dc(this);
CBrush* pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush* pOldBrush=dc.SelectObject(pBrush);
dc.Rectangle(CRect(m_ptOrigin,point));
dc.SelectObject(pOldBrush);
四、繪製連續線條
1、滑鼠移動訊息WM_MOUSEMOVE,可用來繪製連續線條
2、實現代碼
CClientDC dc(this);
if(m_bDraw)
{
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
m_ptOrigin=point;
}
五、繪製扇形效果的線條
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0));
CPen* pOldPen=dc.SelectObject(&pen);
if(m_bDraw)
{
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.LineTo(m_ptOld);
m_ptOld=point;
}
dc.SelectObject(pOldPen);