天天看點

MFC畫圖

繪制任意線條:

1、建立基于單文檔工程:draw

cdrawview類中添加成員變量:

cpoint m_ptorigin;

bool m_bdraw;

2、cdrawview()中初始化:

m_ptorigin = point;

m_bdraw = false;

3、添加消息響應函數:

wm_lbuttondown    wm_lbuttonup  wm_mousemove

4、左鍵按下時:

m_bdraw = true;

5、左鍵擡起:

6、滑鼠移動時:

    //畫連續線條

cclientdc dc(this);

if(m_bdraw)

    {

       dc.moveto(m_ptorigin);

       dc.lineto(point);

       m_ptorigin = point;

    }

    //畫扇形線條

    if(m_bdraw)

    //畫帶外包線的扇形線條

析:畫帶外包線的扇形線條,不光記錄初始位置,還要記錄滑鼠移動上一位置。

添加成員變量:

cpoint m_ptold;

在滑鼠左鍵按下時初始化:

m_ptold = point;

在滑鼠移動時進行改變:

       dc.lineto(m_ptold);

       dc.moveto(m_ptold);

       m_ptold = point;

畫矩形:

畫無邊框的矩形

方法說明:利用fillrect函數填充矩形。填充内容為畫刷的内容,即畫刷對象的指針。

     cbrush brush(rgb(5,255,255));

     cclientdc dc(this);

     dc.fillrect(crect(m_ptorigin,point),&brush);

以位圖作為畫刷的資源

     cbitmap bitmap;

     bitmap.loadbitmap(idb_bitmap1); 

     cbrush brush(&bitmap);

畫有邊框的矩形

方法說明:利用rectangle方法來畫矩形。其中cbrush與cpen類分别負責矩形内部和矩形邊框的屬性

     //畫中心為白色的矩形

     dc.rectangle(crect(m_ptorigin,point));

     //畫中心為透明的矩形

cbrush *pbrush=cbrush::fromhandle((hbrush)

getstockobject(null_brush));

     cbrush *poldbrush=dc.selectobject(pbrush);

     poldbrush=pbrush;

//畫中心為透明邊為任意顔色的矩形

     cpen pen(ps_solid,1,rgb(234,23,53));

     cpen *poldpen=dc.selectobject(&pen);

     cbrush *pbrush=cbrush::fromhandle((hbrush)

getstockobject(null_brush))

     dc.selectobject(poldpen);

     dc.selectobject(poldbrush);

使用畫筆、畫刷

在onlbuttonup函數中:

/////////////////////////////////////////////////////////////////

cpen pen(ps_solid,1,rgb(234,23,53));

//定義一個cpen類對象,并利用rgb宏改變其顔色

cpen *poldpen=dc.selectobject(&pen); //将其選入裝置表

dc.moveto(m_ptorigin);

dc.lineto(point);

dc.selectobject(poldpen); 

cbrush brush(rgb(0,255,0)); 

cclientdc dc(this); 

crect rect(m_ptorigin,point); 

dc.fillrect(&rect,&brush); 

使用位圖建立畫刷:

插入->資源->位圖->引入,可以引入位圖,初始一般命名為:idb_bitmap1

cbitmap bitmap; 

bitmap.loadbitmap(idb_bitmap1); 

cbrush brush(&bitmap); 

dc.fillrect(&rect,&brush);

cbrush *brush; 

brush = cbrush::fromhandle((hbrush)getstockobject(null_brush));

cbrush *poldbrush =dc.selectobject(brush) ;  

dc.rectangle(crect(m_ptorigin,point)); 

dc.selectobject(poldbrush) ; 

注:

常用的繪圖裝置類對象的建立和将其引入到裝置環境中的方法

在選擇繪圖裝置類對象(gdi對象)進行繪圖時,一般可按下列步驟進行:

(1)定義一個gdi對象,然後調用相應的函數(如createpen、createsolidbrush等)建立此gdi對象。

(2)将已構造出的gdi對象利用裝置環境類對象的成員函數selectobject選入到目前環境中,并同時将原來的gdi對象儲存起

來。

(3)繪圖結束後,恢複目前裝置環境中原來的gdi對象。

注意:在windows系統中包含了一些庫存的gdi對象,在第(3)步中可直接利用裝置環境類(cdc)的成員函數

selectstockobject将一個windows庫存的gdi對象選入,系統可自動将原來選入的gdi對象從裝置環境中分離出來。