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. nginx可用来干什么?

    1.静态HTTP服务器 首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML.图片)通过HTTP协议展现给客户端. 配置: server { listen80; # 端口号 lo ...

  2. git命令(使用visual studio)

    拉取,提取,合并 提交到本地 切换分支 创建分支 推送到远端 删除本地分支 删除远程分支

  3. WEB 前端模块化,读文笔记

    文章链接 WEB 前端模块化都有什么? 知识点 根据平台划分 浏览器 AMD.CMD 存在网络瓶颈,使用异步加载 非浏览器 CommonJS 直接操作 IO,同步加载 浏览器 AMD 依赖前置 req ...

  4. 【牛客小白月赛6】F 发电 - 树状数组&快速幂&逆元

    题目地址:https://www.nowcoder.com/acm/contest/136/F 树状数组.快速幂.逆元的模板运用: #include<iostream> #include& ...

  5. bacula快速部署

    快速部署: Server端:DD.SD.Monitor.Console均部署在Server上Client端:FD Server端部署:上传事先下载的源码包 tar xvf bacula-9.2.0.t ...

  6. python 04 学生信息管理系统

    今天任务不多,做了学生信息管理系统1.0,使用字典存储学生个体信息,列表存储学生字典.注意dict定义要在循环体内,若定义成全局变量或循环体外,则旧数据会被新数据覆盖.dict属于可变类型数据,内容改 ...

  7. python:零散记录

    1.rstrip()删除末尾指定字符串 例如:A = '1,2,3,4,5,' B = A.rstrip(',') B = '1,2,3,4,5' 2.isdigit()方法 Python isdig ...

  8. pyquery 基本使用笔记

    安装 pip install pyquery 导入 from pyquery import PyQuery as pq 初始化: from pyquery import PyQuery as pq h ...

  9. LeetCode(51) N-Queens

    题目 The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two quee ...

  10. POJ 3169 Layout(差分约束 线性差分约束)

    题意: 有N头牛, 有以下关系: (1)A牛与B牛相距不能大于k (2)A牛与B牛相距不能小于k (3)第i+1头牛必须在第i头牛前面 给出若干对关系(1),(2) 求出第N头牛与第一头牛的最长可能距 ...