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);
}

效果:

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. Vue项目结构梳理

    Vue项目结构图: 简单介绍目录结构 build目录是一些webpack的文件,配置参数什么的,一般不用动 config是vue项目的基本配置文件 node_modules是项目中安装的依赖模块 sr ...

  2. 【转】密码学 :CSP的概念

    转:[密码学]CSP的概念 CSP加密服务提供者(Cryptographic Service Provider)具有一下几个特点: CSP是真正执行密码运算的独立模块 物理上一个CSP由两部分组成:一 ...

  3. idea创建Maven项目时Maven插件内看不到mybatis-generator

    创建Maven项目时插件配置添加了mybatis-generator但是右侧maven project始终没有看到插件 需要放在和pluginManagement同级别,修改配置如下:

  4. More Effective C++ - 章节二 : 操作符(operators)

    5. 对定制的 "类型转换函数" 保持警觉 允许编译器执行隐式类型转换,害处多过好处,不要提供转换函数,除非你确定需要. class foo { foo(int a = 0, in ...

  5. 1.INFORMATION_SCHEMA简介

    1. INFORMATION_SCHEMA简介 INFORMATION_SCHEMA提供对数据库元数据的访问,有关MySQL服务器信息,例如数据库或表的名称,列的数据类型或访问权限. INFORMAT ...

  6. Python简介--备份

    脚本开头指定解释器路径  /usr/bin/env  python  和  /usr/bin/python比较.(Linux在PATH中找到第一个路径的Python版本来执行) PATH中第一个路径是 ...

  7. Nginx配置ThinkPHP和Laravel虚拟主机

    ThinkPHP server { listen 443 ssl; server_name abc.com; root /var/www/abc; ssl on; ssl_certificate /e ...

  8. Django框架基础知识11-会话状态保持及表单

    浏览器存储cookie的方式不太安全,那有没有更好些的来存储登入状态的方式呢??? 状态保持----cookie和session: 状态保持: 1.http协议是无状态的:每次请求都是一次新的请求,不 ...

  9. day15-python之变量和递归

    1.局部变量与全局变量 #!/usr/bin/env python # -*- coding:utf-8 -*- # name='lhf' # def change_name(): # global ...

  10. LeetCode(87) Gray Code

    题目 The gray code is a binary numeral system where two successive values differ in only one bit. Give ...