C++MFC編程筆記day06 MFC向導、MFC畫圖類使用


 MFC畫圖
   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);
}

效果:







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM