mfc-簡單繪圖

來源:互聯網
上載者:User

 

二、繪製線條

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);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.