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;

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

  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. void CMFCdraw2View::OnLButtonUp(UINT nFlags, CPoint point)
  37. {
  38. // TODO: Add your message handler code here and/or call default
  39. m_bFlag=FALSE;//结束画线
  40. CView::OnLButtonUp(nFlags, point);
  41. }
  42.  
  43. void CMFCdraw2View::OnMouseMove(UINT nFlags, CPoint point)
  44. {
  45. // TODO: Add your message handler code here and/or call default
  46. CClientDC dc(this);
  47. if(m_bFlag)
  48. {
  49. //擦线
  50. DrawShape(&dc,m_ptBegin,m_ptEnd);
  51. //画线
  52. DrawShape(&dc,m_ptBegin,point);
  53. //保存终点位置,为擦线准备
  54. m_ptEnd=point;
  55. }
  56. CView::OnMouseMove(nFlags, point);
  57. }
  58. void CMFCdraw2View::DrawShape(CDC *pDC, CPoint p1, CPoint p2)
  59. {
  60. //设置画图模式,R2_NOT与当前画线处颜色相反
  61. pDC->SetROP2(R2_NOT);
  62. //设置画刷为透明画刷
  63. CBrush *pOldBrush=
  64. (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
  65. switch (m_nType)
  66. {
  67. case 1://直线
  68. pDC->MoveTo(p1);
  69. pDC->LineTo(p2);
  70. break;
  71. case 2://矩形
  72. pDC->Rectangle(p1.x,p1.y,p2.x,p2.y);
  73. break;
  74. case 3://椭圆
  75. pDC->Ellipse(p1.x,p1.y,p2.x,p2.y);
  76. break;
  77. }
  78. //恢复默认画刷
  79. pDC->SelectObject(pOldBrush);
  80.  
  81. }
  82.  
  83. void CMFCdraw2View::OnUpdateDrawElipse(CCmdUI* pCmdUI)
  84. {
  85. // TODO: Add your command update UI handler code here
  86. pCmdUI->SetRadio(m_nType==3);//更改选中的状态
  87. }
  88.  
  89. void CMFCdraw2View::OnUpdateDrawLine(CCmdUI* pCmdUI)
  90. {
  91. // TODO: Add your command update UI handler code here
  92. pCmdUI->SetRadio(m_nType==1);
  93. }
  94.  
  95. void CMFCdraw2View::OnUpdateDrawRect(CCmdUI* pCmdUI)
  96. {
  97. // TODO: Add your command update UI handler code here
  98. pCmdUI->SetRadio(m_nType==2);
  99. }

效果:

C++MFC编程笔记day06 MFC向导、MFC画图类使用的更多相关文章

  1. C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理

    一.MFC概念和作用 1.全称Microsoft Foundation Class Library,我们称为微软基础类库,封闭了绝大部分的win32 Api函数,C++语法中的数据结构,程序的运行流程 ...

  2. C++MFC编程笔记day05 文档类-单文档和多文档应用程序

    文档类 1 相关类    CDocument类-父类是CCmdTarget类,所以,文档类也能够处理菜单等               命令消息. 作用保存和管理数据.    注意事项:怎样解决断言错 ...

  3. C++MFC编程笔记day03 MFC工具栏、状态栏、视图窗体

    MFC工具栏 相关类: CToolBarCtrl - 父类是 CWnd  封装了工具栏控件相关操作 CToolBar - 父类是CControlBar  封装了工具栏和框架窗体之间的关系 工具栏使用: ...

  4. visual2017专业版MFC编程环境搭建及第一个MFC程序的创建

    1.MFC介绍及环境搭建 MFC全程为Microsoft Foundation class Library,即微软的基本类库,MFC实际上是一个庞大的文件库,它由指向文件和源文件组成. 首先,打开vi ...

  5. VS2010/MFC编程入门之四十三(MFC常用类:CTime类和CTimeSpan类)

    上一节中鸡啄米讲了MFC常用类CString类的用法,本节继续讲另外两个MFC常用类-日期和时间类CTime类和CTimeSpan类. 日期和时间类简介 CTime类的对象表示的时间是基于格林威治标准 ...

  6. 深入浅出MFC学习笔记 第三章 MFC六大关键技术之仿真

    0:MFC类层次结构 1:MFC程序的初始化过程CWinApp::InitApplication()CMyWinApp::InitInstance()CMyFrameWnd::CMyFrameWnd( ...

  7. 标C编程笔记day06 动态分配内存、函数指针、可变长度參数

    动态分配内存:头文件 stdlib.h     malloc:分配内存     calloc:分配内存,并清零     realloc:调整已分配的内存块大小     演示样例:         in ...

  8. C/C++编程笔记:C++入门知识丨类和对象

    本篇要学习的内容和知识结构概览 类及其实例化 类的定义 将一组对象的共同特征抽象出来, 从而形成类的概念. 类包括数据成员和成员函数, 不能在类的声明中对数据成员进行初始化 声明类 形式为: clas ...

  9. C#高级编程笔记 (1至6章节)数组,类/方法/泛型

    2.3变量 var 类型推断 type 类的分类 如:type nametype = name.GetType(); //取变量name的类型 const 常量  const int painame ...

随机推荐

  1. C++中:点运算符和箭头运算符的区别

    点运算符用于获取对象成员: 箭头运算符用于获取指针指向的对象的成员: 例如: std::string s1 = "string"; std::string *p = &s1 ...

  2. 微信小程序---协同工作和发布

    (1)协同开发和发布 在中大型的公司里,人员的分工非常仔细,一般会有不同岗位角色的员工同时参与同一个小程序项目.为此,小程序平台设计了不同的权限管理使得项目管理者可以更加高效管理整个团队的协同工作. ...

  3. (11) openssl req(生成请求证书、私钥和自建CA)

    伪命令req大致有3个功能:生成证书请求文件.验证证书请求文件和创建根CA. 由于openssl req命令选项较多,所以先各举几个例子,再集中给出openssl req的选项说明.若已熟悉opens ...

  4. python 容器 用户注册登录系统

    1. 列表和普通变量有什么区别 列表是数据类型,普通变量是用来存储数据的 可以把列表赋值给普通变量 2.存在列表 a = [11, 22, 33], 如何向列表中添加(增)新元素 44 a.appen ...

  5. Jvm:性能调优监控工具

    现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 .... ...

  6. Django框架基础知识08-表关联对象及多表查询

    1.自定义主键字段的创建 AutoFiled(pirmary_key=True) # 一般不会自定义,int类型,自增长 一般不自定义主键. 2.order_by asc desc from djan ...

  7. POJ 1985 Cow Marathon (求树的直径)

    Description After hearing about the epidemic of obesity in the USA, Farmer John wants his cows to ge ...

  8. LayUI分页基于ASP.NET MVC

    ---恢复内容开始--- 今天写了挺久的分页,百度了很多都没有很好的.Net实例,今天我来更新一期关于layuiTable分页 首先你得理解layui的官方文档的Table分页部分,我在这里附上地址 ...

  9. 理解js的几个关键问题(2): 对象、 prototype、this等

    参考文档:http://www.cnblogs.com/ranran/archive/2014/05/19/3737217.html http://speakingjs.com/es5/ch17.ht ...

  10. linux进程按启动时间排序命令

    show me the code... ps aux --sort=start_time|grep Full|grep -v grep