关闭

C++MFC编程笔记day06 MFC向导、MFC绘图类使用

标签: mfcc++
352人阅读 评论(0) 收藏 举报
分类:
MFC绘图
   MFC绘图类包括绘图设备类和绘图对象类
   1 绘图设备类
     CDC类-父类是CObject,封装的是一般的绘图设备,例如:显示器,
           打印机等。
     CWindowDC类-父类是CDC类,封装的是窗口对象,包括客户区和非
           客户区。
     CClientDC类-父类是CDC类,封装的仍然是窗口,但是只包括客户区。
     CPaintDC类-父类是CDC类,封装的是窗口的客户区。但是,它只用
             在窗口的WM_PAINT消息处理函数中。
     CMetaFileDC类-父类是CDC类,作用保存绘制命令。
   2 使用
    创建MFC AppWizard(exe)工程,添加菜单项,然后使用类向导生成消息命令的函数体框架。
     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;


//功能实现部分主要代码

  1. void CMFCdrawView::OnDcCwindowdc()   
  2. {  
  3.     // TODO: Add your command handler code here  
  4.     CWindowDC dc(AfxGetMainWnd());  
  5.     dc.TextOut(0,0,"Hello CWindowDC");  
  6.   
  7. }  
  8.   
  9. void CMFCdrawView::OnDcCmetafiledc()   
  10. {  
  11.     // TODO: Add your command handler code here  
  12.     //创建  
  13.     CMetaFileDC dc;  
  14.     dc.Create();  
  15.     //绘制命令  
  16.     dc.TextOut(100,100,"DcCmetafile");  
  17.     dc.MoveTo(150,150);  
  18.     dc.LineTo(200,200);  
  19.     //关闭,并返回句柄  
  20.     m_hMetafile= dc.Close();  
  21.     CClientDC dc2(this);  
  22.     dc2.PlayMetaFile(m_hMetafile);  
  23. }  
  24.   
  25. void CMFCdrawView::OnDcCclientdc()   
  26. {  
  27.     // TODO: Add your command handler code here  
  28.     CClientDC dc(this);  
  29.     dc.TextOut(0,0,"Hello CClientDC");  
  30. }  
  31.   
  32. void CMFCdrawView::OnDcCdc()   
  33. {  
  34.     // TODO: Add your command handler code here  
  35.     CDC dc;  
  36.     dc.CreateDC("DISPLAY",NULL,NULL,NULL);//打印到屏幕上  
  37.     RECT rc={0};  
  38.     rc.left=0;rc.right=200;rc.top=0;rc.bottom=100;  
  39.     dc.DrawText("hello cdc",&rc,DT_MODIFYSTRING);  
  40.     dc.DeleteDC();  
  41. }  
  42.   
  43. void CMFCdrawView::OnPaint()   
  44. {  
  45.     CPaintDC dc(this); // device context for painting  
  46.     dc.TextOut(0,20,"Hell0 Paint");  
  47.     //使用CMetaFile  
  48.     if(m_hMetafile) dc.PlayMetaFile(m_hMetafile);  
  49.     //OnGdiBitmap();  
  50.     // Do not call CView::OnPaint() for painting messages  
  51. }  
  52.   
  53. void CMFCdrawView::OnGdiBitmap()   
  54. {  
  55.     // TODO: Add your command handler code here  
  56.     CClientDC dc(this);  
  57.     CDC dcBitmap;//内存dc  
  58.     dcBitmap.CreateCompatibleDC(&dc);  
  59.     CBitmap bmp;//位图对象  
  60.     bmp.LoadBitmap(IDB_BITMAP1);//插入的图片资源  
  61.     CBitmap*oldbmp=dcBitmap.SelectObject(&bmp);//放入内存dc  
  62.     //dc.BitBlt(300,300,110,37,&dcBitmap,0,0,SRCCOPY);//成像  
  63.     RECT rc={0};  
  64.     GetClientRect(&rc);  
  65.     //拉伸成像  
  66.     dc.StretchBlt(0,0,rc.right,rc.bottom,&dcBitmap,0,0,101,37,SRCCOPY);  
  67.     dcBitmap.SelectObject(oldbmp);  
  68.     dcBitmap.DeleteDC();//删除内存dc  
  69.     bmp.DeleteObject();//删除位图对象  
  70.       
  71. }  
  72.   
  73. void CMFCdrawView::OnGdiBrush()   
  74. {  
  75.     // TODO: Add your command handler code here  
  76.     //CBrush brush(HS_CROSS,RGB(0,255,0));//普通画刷  
  77.     CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP2);  
  78.     CBrush brush(&bmp);//位图画刷  
  79.     CClientDC dc(this);  
  80.     CBrush*oldbrush=dc.SelectObject(&brush);  
  81.     dc.RoundRect(50,50,220,220,2,2);  
  82.     dc.SelectObject(oldbrush);  
  83.     brush.DeleteObject();  
  84.       
  85. }  
  86.   
  87. void CMFCdrawView::OnGdiFont()   
  88. {  
  89.     // TODO: Add your command handler code here  
  90.     CFont font;  
  91.     font.CreatePointFont(500,"黑体");  
  92.     CClientDC dc(this);  
  93.     CFont*oldfont=dc.SelectObject(&font);  
  94.     dc.TextOut(150,150,"OnGdiFont");  
  95.     dc.SelectObject(oldfont);  
  96.     font.DeleteObject();  
  97. }  
  98.   
  99. void CMFCdrawView::OnGdiPen()   
  100. {  
  101.     // 创建画笔  
  102.     CPen pen(PS_SOLID,5,RGB(255,0,0));  
  103.     //将画笔选择当前设备  
  104.     CClientDC dc(this);  
  105.     CPen * oldpen=dc.SelectObject(&pen);  
  106.     dc.TextOut(10,10,"OnGdiPen");  
  107.     dc.RoundRect(100,100,200,200,2,2);  
  108.     dc.SelectObject(oldpen);  
  109.     pen.DeleteObject();  
  110.       
  111. }  
  112.   
  113. void CMFCdrawView::OnGdiRgn()   
  114. {  
  115.     CRgn rgn1,rgn2;  
  116.     //创建  
  117.     rgn1.CreateEllipticRgn(100,100,300,300);  
  118.     rgn2.CreateEllipticRgn(150,100,350,300);  
  119.     //几何运算  
  120.     rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR);  
  121.     //填充  
  122.     CClientDC dc(this);  
  123.     CBrush brush(RGB(255,0,0));  
  124.     CBrush brush2(RGB(0,0,255));  
  125.     dc.FillRgn(&rgn1,&brush);  
  126.     //dc.FillRgn(&rgn2,&brush2);  
  127.     //填充边框  
  128.     dc.FrameRgn(&rgn1,&brush2,5,1);  
  129.     //将窗口的区域设置成rgn1  
  130.     AfxGetMainWnd()->SetWindowRgn(rgn1,TRUE);  
  131. }  
效果:



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中主要实现代码:

  1. //构造函数  
  2. CMFCdraw2View::CMFCdraw2View()  
  3. {  
  4.     // TODO: add construction code here  
  5.     m_nType=0;  
  6.     m_bFlag=FALSE;  
  7.     m_ptBegin=m_ptEnd=0;  
  8. }  
  9.   
  10. void CMFCdraw2View::OnDrawElipse()   
  11. {  
  12.     // TODO: Add your command handler code here  
  13.     m_nType=3;  
  14. }  
  15.   
  16. void CMFCdraw2View::OnDrawLine()   
  17. {  
  18.     // TODO: Add your command handler code here  
  19.     m_nType=1;  
  20. }  
  21.   
  22. void CMFCdraw2View::OnDrawRect()   
  23. {  
  24.     // TODO: Add your command handler code here  
  25.     m_nType=2;  
  26. }  
  27.   
  28. void CMFCdraw2View::OnLButtonDown(UINT nFlags, CPoint point)   
  29. {  
  30.     // TODO: Add your message handler code here and/or call default  
  31.     m_bFlag=TRUE;//开始绘图  
  32.     m_ptBegin=m_ptEnd=point; //确定起点位置   
  33.     CView::OnLButtonDown(nFlags,point);  
  34. }  
  35.   
  36.   
  37. void CMFCdraw2View::OnLButtonUp(UINT nFlags, CPoint point)   
  38. {  
  39.     // TODO: Add your message handler code here and/or call default  
  40.     m_bFlag=FALSE;//结束画线  
  41.     CView::OnLButtonUp(nFlags, point);  
  42. }  
  43.   
  44. void CMFCdraw2View::OnMouseMove(UINT nFlags, CPoint point)   
  45. {  
  46.     // TODO: Add your message handler code here and/or call default  
  47.     CClientDC dc(this);  
  48.     if(m_bFlag)  
  49.     {  
  50.         //擦线  
  51.         DrawShape(&dc,m_ptBegin,m_ptEnd);  
  52.         //画线  
  53.         DrawShape(&dc,m_ptBegin,point);  
  54.         //保存终点位置,为擦线准备  
  55.         m_ptEnd=point;  
  56.     }  
  57.     CView::OnMouseMove(nFlags, point);  
  58. }  
  59. void CMFCdraw2View::DrawShape(CDC *pDC, CPoint p1, CPoint p2)  
  60. {  
  61.     //设置绘图模式,R2_NOT与当前画线处颜色相反  
  62.     pDC->SetROP2(R2_NOT);  
  63.     //设置画刷为透明画刷  
  64.     CBrush *pOldBrush=  
  65.         (CBrush*)pDC->SelectStockObject(NULL_BRUSH);  
  66.     switch (m_nType)  
  67.     {  
  68.     case 1://直线  
  69.         pDC->MoveTo(p1);  
  70.         pDC->LineTo(p2);  
  71.         break;  
  72.     case 2://矩形  
  73.         pDC->Rectangle(p1.x,p1.y,p2.x,p2.y);  
  74.         break;  
  75.     case 3://椭圆  
  76.         pDC->Ellipse(p1.x,p1.y,p2.x,p2.y);  
  77.         break;  
  78.     }  
  79.     //恢复默认画刷  
  80.     pDC->SelectObject(pOldBrush);  
  81.       
  82. }  
  83.   
  84. void CMFCdraw2View::OnUpdateDrawElipse(CCmdUI* pCmdUI)   
  85. {  
  86.     // TODO: Add your command update UI handler code here  
  87.     pCmdUI->SetRadio(m_nType==3);//更改选中的状态  
  88. }  
  89.   
  90. void CMFCdraw2View::OnUpdateDrawLine(CCmdUI* pCmdUI)   
  91. {  
  92.     // TODO: Add your command update UI handler code here  
  93.     pCmdUI->SetRadio(m_nType==1);  
  94. }  
  95.   
  96. void CMFCdraw2View::OnUpdateDrawRect(CCmdUI* pCmdUI)   
  97. {  
  98.     // TODO: Add your command update UI handler code here  
  99.     pCmdUI->SetRadio(m_nType==2);  
  100. }  

效果:



http://blog.csdn.net/pukuimin1226/article/details/38365671

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:389910次
    • 积分:2846
    • 等级:
    • 排名:第12592名
    • 原创:75篇
    • 转载:169篇
    • 译文:0篇
    • 评论:5条
    最新评论