MFC畫圖類包含畫圖設備類和畫圖對象類
1 畫圖設備類
CDC類-父類是CObject,封裝的是一般的畫圖設備,比如:顯示器,
打印機等。
CWindowDC類-父類是CDC類。封裝的是窗體對象,包含客戶區和非
客戶區。
CClientDC類-父類是CDC類,封裝的仍然是窗體。可是僅僅包含客戶區。
CPaintDC類-父類是CDC類,封裝的是窗體的客戶區。可是,它僅僅用
在窗體的WM_PAINT消息處理函數中。
CMetaFileDC類-父類是CDC類,作用保存繪制命令。
2 使用
創建MFC AppWizard(exe)project,加入菜單項。然后使用類向導生成消息命令的函數體框架。
2.1 CDC::CreateDC()-創建畫圖設備
virtual BOOL CreateDC(
LPCTSTR lpszDriverName,//設備的驅動名稱
LPCTSTR lpszDeviceName,//設備名稱
LPCTSTR lpszOutput,//接口
const void* lpInitData//設備的初始化參數
);
設備為顯示器時,("DISPLAY",NULL,NULL,NULL);
2.2 使用
....
2.3 CDC::DeleteDC()-刪除設備
2.4 CDC的子類CWindowDC、CClientDC、CPaintDC,在構造函數中
調用CreateDC(),在析構函數中調用DeleteDC(),所以,子類使用
僅僅須要構造對象就可以。
2.5 CMetaFileDC類的使用
2.5.1 創建
CMetaFileDC::Create
2.5.2 繪制
....
2.5.3 關閉。返回句柄 HMETAFILE
CMetaFileDC::Close
2.5.4 使用
CDC::PlayMetaFile
2.5.5 刪除
DeleteMetaFile
3 畫圖對象類
3.1 CPen-畫筆
3.2 CBrush-畫刷
3.3 CFont-字體
3.4 CBitmap-位圖
3.5 CRgn-區域
3.6 CPalette-調色板
RGB(0~255,0~255,0~255),每一個顏色值占3個字節。
彩色位圖,800*600像素,位圖大小是:800*600*3 字節
顏色表大小 48*3 +800*600*1
3.7 使用
3.7.1 CPen、CBrush、CFont的使用
3.7.2 CBitmap的使用
3.7.3 CRgn的使用
1 創建
CRgn::CreateXXX
2 將兩個CRgn對象進行幾何運算
CRgn::CombineRgn
3 填充
CDC::FillRgn
4 填充邊框
CDC::FrameRgn
程序演示樣例:






在****view類中,定義一個成員變量:
HMETAFILE m_hMetafile;
//功能實現部分主要代碼
void CMFCdrawView::OnDcCwindowdc()
{
// TODO: Add your command handler code here
CWindowDC dc(AfxGetMainWnd());
dc.TextOut(0,0,"Hello CWindowDC");
}
void CMFCdrawView::OnDcCmetafiledc()
{
// TODO: Add your command handler code here
//創建
CMetaFileDC dc;
dc.Create();
//繪制命令
dc.TextOut(100,100,"DcCmetafile");
dc.MoveTo(150,150);
dc.LineTo(200,200);
//關閉,並返回句柄
m_hMetafile= dc.Close();
CClientDC dc2(this);
dc2.PlayMetaFile(m_hMetafile);
}
void CMFCdrawView::OnDcCclientdc()
{
// TODO: Add your command handler code here
CClientDC dc(this);
dc.TextOut(0,0,"Hello CClientDC");
}
void CMFCdrawView::OnDcCdc()
{
// TODO: Add your command handler code here
CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);//打印到屏幕上
RECT rc={0};
rc.left=0;rc.right=200;rc.top=0;rc.bottom=100;
dc.DrawText("hello cdc",&rc,DT_MODIFYSTRING);
dc.DeleteDC();
}
void CMFCdrawView::OnPaint()
{
CPaintDC dc(this); // device context for painting
dc.TextOut(0,20,"Hell0 Paint");
//使用CMetaFile
if(m_hMetafile) dc.PlayMetaFile(m_hMetafile);
//OnGdiBitmap();
// Do not call CView::OnPaint() for painting messages
}
void CMFCdrawView::OnGdiBitmap()
{
// TODO: Add your command handler code here
CClientDC dc(this);
CDC dcBitmap;//內存dc
dcBitmap.CreateCompatibleDC(&dc);
CBitmap bmp;//位圖對象
bmp.LoadBitmap(IDB_BITMAP1);//插入的圖片資源
CBitmap*oldbmp=dcBitmap.SelectObject(&bmp);//放入內存dc
//dc.BitBlt(300,300,110,37,&dcBitmap,0,0,SRCCOPY);//成像
RECT rc={0};
GetClientRect(&rc);
//拉伸成像
dc.StretchBlt(0,0,rc.right,rc.bottom,&dcBitmap,0,0,101,37,SRCCOPY);
dcBitmap.SelectObject(oldbmp);
dcBitmap.DeleteDC();//刪除內存dc
bmp.DeleteObject();//刪除位圖對象
}
void CMFCdrawView::OnGdiBrush()
{
// TODO: Add your command handler code here
//CBrush brush(HS_CROSS,RGB(0,255,0));//普通畫刷
CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP2);
CBrush brush(&bmp);//位圖畫刷
CClientDC dc(this);
CBrush*oldbrush=dc.SelectObject(&brush);
dc.RoundRect(50,50,220,220,2,2);
dc.SelectObject(oldbrush);
brush.DeleteObject();
}
void CMFCdrawView::OnGdiFont()
{
// TODO: Add your command handler code here
CFont font;
font.CreatePointFont(500,"黑體");
CClientDC dc(this);
CFont*oldfont=dc.SelectObject(&font);
dc.TextOut(150,150,"OnGdiFont");
dc.SelectObject(oldfont);
font.DeleteObject();
}
void CMFCdrawView::OnGdiPen()
{
// 創建畫筆
CPen pen(PS_SOLID,5,RGB(255,0,0));
//將畫筆選擇當前設備
CClientDC dc(this);
CPen * oldpen=dc.SelectObject(&pen);
dc.TextOut(10,10,"OnGdiPen");
dc.RoundRect(100,100,200,200,2,2);
dc.SelectObject(oldpen);
pen.DeleteObject();
}
void CMFCdrawView::OnGdiRgn()
{
CRgn rgn1,rgn2;
//創建
rgn1.CreateEllipticRgn(100,100,300,300);
rgn2.CreateEllipticRgn(150,100,350,300);
//幾何運算
rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR);
//填充
CClientDC dc(this);
CBrush brush(RGB(255,0,0));
CBrush brush2(RGB(0,0,255));
dc.FillRgn(&rgn1,&brush);
//dc.FillRgn(&rgn2,&brush2);
//填充邊框
dc.FrameRgn(&rgn1,&brush2,5,1);
//將窗體的區域設置成rgn1
AfxGetMainWnd()->SetWindowRgn(rgn1,TRUE);
}
效果:

2、
簡單的鼠標畫圖的樣例
1 圖形數據,1 起點和終點,CPoint;
2 使用整數變量確定當前繪制的圖形
UINT m_nType;
m_nType=1;直線
m_nType=2;矩形
m_nType=3;橢圓
m_nType=0;不繪制圖形
3 BOOL m_bFlag;//標識是否開始畫線
2 繪制過程
2.1 LBUTTONDOWN消息
m_bFlag=TRUE;//開始畫圖
m_ptBegin=m_ptEnd=point; //確定起點位置
2.2 MOUSEMOVE消息
if(m_bFlag)
{
//擦線
//畫線
}
2.3 LBUTTONUP消息
m_bFlag=FALSE;//結束畫線
模擬畫圖軟件,鼠標點下進行畫圖。放開則繪制指定的圖形。
新建立 MFC 應用程序,並依照例如以下操作:




在****view 中,增加成員變量:
CPoint m_ptBegin;//起點坐標
CPoint m_ptEnd;//終點坐標
UINT m_nType;//類型:1-直線,2-距形。3-圓
BOOL m_bFlag;//是否開始畫線
****view中主要實現代碼:
//構造函數
CMFCdraw2View::CMFCdraw2View()
{
// TODO: add construction code here
m_nType=0;
m_bFlag=FALSE;
m_ptBegin=m_ptEnd=0;
}
void CMFCdraw2View::OnDrawElipse()
{
// TODO: Add your command handler code here
m_nType=3;
}
void CMFCdraw2View::OnDrawLine()
{
// TODO: Add your command handler code here
m_nType=1;
}
void CMFCdraw2View::OnDrawRect()
{
// TODO: Add your command handler code here
m_nType=2;
}
void CMFCdraw2View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bFlag=TRUE;//開始畫圖
m_ptBegin=m_ptEnd=point; //確定起點位置
CView::OnLButtonDown(nFlags,point);
}
void CMFCdraw2View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bFlag=FALSE;//結束畫線
CView::OnLButtonUp(nFlags, point);
}
void CMFCdraw2View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
if(m_bFlag)
{
//擦線
DrawShape(&dc,m_ptBegin,m_ptEnd);
//畫線
DrawShape(&dc,m_ptBegin,point);
//保存終點位置,為擦線准備
m_ptEnd=point;
}
CView::OnMouseMove(nFlags, point);
}
void CMFCdraw2View::DrawShape(CDC *pDC, CPoint p1, CPoint p2)
{
//設置畫圖模式,R2_NOT與當前畫線處顏色相反
pDC->SetROP2(R2_NOT);
//設置畫刷為透明畫刷
CBrush *pOldBrush=
(CBrush*)pDC->SelectStockObject(NULL_BRUSH);
switch (m_nType)
{
case 1://直線
pDC->MoveTo(p1);
pDC->LineTo(p2);
break;
case 2://矩形
pDC->Rectangle(p1.x,p1.y,p2.x,p2.y);
break;
case 3://橢圓
pDC->Ellipse(p1.x,p1.y,p2.x,p2.y);
break;
}
//恢復默認畫刷
pDC->SelectObject(pOldBrush);
}
void CMFCdraw2View::OnUpdateDrawElipse(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetRadio(m_nType==3);//更改選中的狀態
}
void CMFCdraw2View::OnUpdateDrawLine(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetRadio(m_nType==1);
}
void CMFCdraw2View::OnUpdateDrawRect(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetRadio(m_nType==2);
}
效果:

