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); }
效果: