MFC经典绘图方法总结

合集下载

MFC绘图教程

MFC绘图教程
3/21/2011 12
常用颜色对照表
例:COLLORREF red = RGB(255,0,0);
3/21/2011
13
中获取DC 在MFC中获取 中获取
在如OnDraw等函数中传递一个指向 等函数中传递一个指向CDC 对象的 在如 等函数中传递一个指向 指针
3/21/2011
9
设备环境类的基本功能
3/21/2011
10
CDC类常用绘图函数 类常用绘图函数
Arc:绘制一段弧 : Chord:绘制弦形 : Ellipse:绘制椭圆或圆 : MoveTo:将当前位置移动到指定位置 : LineTo:从当前位置到指定位置画一条直线 : Polyline:画连接指定点的折线段 : PolyBezler:根据两个端点和两个控制点画贝塞尔曲线 : Pie:画冰块 : Polygon:根据两个或两个以上的顶点绘制一个多边形 : Rectangle:根据指定的左上角和右下角坐标绘制一个矩形 : RoundRect:画圆角矩形 : SetPixel:画一个点 :
void CView::OnPaint() { CPaintDC dc(this); OnPrepareDC(&dc); ; OnDraw(&dc); //调用了 调用了OnDraw 调用了 }
可见OnPaint函数也调用了 可见 函数也调用了CView::OnDraw函数。因而一 函数。 函数也调用了 函数 般在OnDraw函数内添加绘图代码,完成绘图任务 函数内添加绘图代码, 般在 函数内添加绘图代码
3/21/2011
16
OnDraw与OnPaint的区别 与 的区别
OnDraw是CView类的成员函数,不响应消息;OnPaint是 是 类的成员函数, 类的成员函数 不响应消息; 是 CWnd类的成员函数,相应 类的成员函数, 消息。 类的成员函数 相应WM_PAINT消息。 消息 CView默认调用的 默认调用的OnPaint函数如下 默认调用的 函数如下

MFC基本绘图函数使用方法

MFC基本绘图函数使用方法
计算机图形学
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数 绘制图形如下所示,坐标(100, 150)表示距离左边100,距离顶部 150。
计算机图形学
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数 注意:绘制图形主要调用CDC* pDC方法实现,MFC可以补充 提示函数。
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数
(1)绘制直线
计算机图形学
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数
void CTest01View::OnDraw(CDC* pDC) {
CTest01Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC->MoveTo(100,150); pDC->LineTo(300,400); // TODO: add draw code for native data here }
MFC绘图工具类包括CGdiObject、CBitmap、CBrush、 CFont、CPallette、CPen和CRgn等。常用的包括:
(4) CPen:封装了GDI画笔,选作设备上下文的当前画笔, 画笔用于绘制图形边界线;
(5) CPallette:封装了GDI调色板,提供应用程序和显示器 之间的颜色接口;
计算机图形学
一.MFC基本绘图函数使用方法
一. MFC绘图基础知识 CDC类
CDC类派生出CClientDC类、CMetaFileDC类、 CPaintDC类和CWindowDC类。

MFC画图介绍

MFC画图介绍

第一次用MFC编程,边做边google,把学到的东西做一个总结。

其中可能有误解。

还有些部分留出了标题但没写内容――是因为还没用到那些,故尚未研究。

所有讨论仅针对单文档应用程序(SDI)。

第一章,准备:一,继承与虚函数1,子类重载基类成员函数:(1)覆盖式重载:子类的重载函数完全覆盖掉原基类函数的实现。

如MFC中的OnDraw。

(2)追加式重载:子类的重载函数中调用原基类的函数,只是在此之外又加入一些新语句。

如MFC中的OnTimer, OnLButtonDown, OnMouseMove,OnMouseWheel,OnSetCursor。

2,重载的缺陷及虚函数的解决:若子类重载了基类成员函数:当用子类对象加点运算符访问该函数时,调用的是子类函数,无问题。

但当用基类指针访问子类对象的该函数时,调用的却是原基类函数,与预期不符。

为解决此问题,引入虚函数:将基类被子类重载的函数声明为虚函数,再用基类指针访问子类对象的该函数时,调用的就是子类函数了,恢复了合理性。

注:将基类某成员函数声明为虚函数以后,子类中相应的重载函数也就自动成为了虚的(无论是否加virtual修饰),但为了清晰起鉴,最好也加上virtual。

注:抛开内部实现,仅从理解角度讲,可以认为:虚函数=重载+对象类层次识别。

3,纯虚函数与抽象基类没有实现的虚函数称为纯虚函数,含有纯虚函数的类为抽象类。

抽象类不能定义对象,要向下派生出具体类,因此称作抽象基类。

抽象类中的纯虚函数必须在派生类中给予实现。

抽象类的意义在于从更高抽象层次上为各种对象提供统一接口。

二,消息映射:1,控件消息映射:(1)控件消息:最常见的控件消息有两个:MAND消息:只在点击时响应。

2.UPDA TE_COMMAND_UI消息:时时响应。

还有其它的控件消息,如Button控件的BN_CLICKED消息和BN_DOUBLECLICKED消息。

以下仅以COMMAND消息为例。

MFC中的CDC 绘图(2)

MFC中的CDC 绘图(2)

MFC中的CDC 绘图(2)4.面色(刷)在Windows中,面状图必须用刷(brush)来填充,所以面色是由刷色来确定的。

MFC中的刷类为CBrush(它也是CGDIObject的派生类),刷的创建与使用的步骤与笔的相似。

构造函数有4个:CBrush( ); // 创建一个刷的空对象CBrush( COLORREF crColor ); // 创建颜色为crColor的实心刷CBrush( int nIndex, COLORREF crColor ); // 创建风格由nIndex指定且颜色为crColor的条纹(hatch孵化)刷,其中nIndex可取条纹风格(Hatch Styles)值:符号常量数字常量风格HS_HORIZONTAL 0 水平线HS_VERTICAL 1 垂直线HS_FDIAGONAL 2 正斜线HS_BDIAGONAL 3 反斜线HS_CROSS 4 十字线(正网格)HS_DIAGCROSS 5 斜十字线(斜网格)CBrush( CBitmap* pBitmap ); // 创建位图为pBitmap的图案刷如:pDC->FillRect( &rect, new CBrush( RGB(r, g,b) ) );与构造函数相对应,有多个创建不同类型刷的成员函数:BOOL CreateSolidBrush( COLORREF crColor );BOOL CreateHatchBrush( int nIndex, COLORREF crColor );BOOL CreatePatternBrush( CBitmap* pBitmap );BOOL CreateDIBPatternBrush( HGLOBAL hPackedDIB, UINT nUsage );BOOL CreateDIBPatternBrush( const void* lpPackedDIB, UINT nUsage );BOOL CreateBrushIndirect( const LOGBRUSH* lpLogBrush );BOOL CreateSysColorBrush( int nIndex );预定义的刷对象有BLACK_BRUSH(黑刷)、DKGRAY_BRUSH(暗灰刷)、GRAY_BRUSH(灰刷)、HOLLOW_BRUSH(空刷)、LTGRAY_BRUSH(亮灰刷)、NULL_BRUSH(空刷)、WHITE_BRUSH (白刷)缺省的刷为空刷与笔一样,可以用函数SelectObject或SelectStockObject将自定义的刷或预定义的刷选入DC 中,供绘面状图时使用。

MFC画图程序步骤

MFC画图程序步骤

MFC画图程序步骤MFC(Microsoft Foundation Class)是一种用于开辟Windows应用程序的C++类库。

在MFC中,我们可以使用GDI(Graphics Device Interface)来创建和操作图形。

下面是使用MFC创建一个简单的画图程序的步骤。

步骤1:创建一个新的MFC项目首先,打开Visual Studio并选择创建一个新的项目。

在项目类型中,选择Visual C++ -> MFC,然后选择MFC应用程序类型。

输入项目名称并选择保存的位置。

在应用程序类型中,选择“单文档”或者“多文档”视图,具体根据你的需求而定。

点击“确定”按钮创建项目。

步骤2:设计用户界面在MFC应用程序中,用户界面是通过对话框资源来设计的。

在资源视图中,双击IDD_DIALOG(或者其他对话框资源)以打开对话框编辑器。

在对话框编辑器中,你可以添加按钮、文本框、菜单等控件来设计你的用户界面。

在画图程序中,你可以添加一个画布控件来显示绘制的图形。

步骤3:添加绘图功能在MFC中,你可以使用GDI来进行绘图操作。

打开你的对话框类的头文件(例如,CMyDialog.h),添加以下头文件引用:#include <afxwin.h>#include <afxext.h>#include <afxdisp.h>在对话框类的源文件(例如,CMyDialog.cpp)中,添加以下代码来处理绘图操作:```void CMyDialog::OnPaint(){CPaintDC dc(this); // 用于绘制的设备上下文// 在这里进行绘图操作dc.Rectangle(100, 100, 200, 200); // 绘制一个矩形dc.Ellipse(300, 100, 400, 200); // 绘制一个椭圆}```步骤4:处理绘图事件在对话框类的消息映射中添加对绘图事件的处理。

MFC-画刷,画线,位图填充矩形区域

MFC-画刷,画线,位图填充矩形区域

• *注 :Rectangle要添加到设备描述表中 ,然后才能使用 ;FillRect不用添加到设备描述表中,
用位图或画刷填充矩形区域 (FillRect)
• • • • • • • • • • • • • • a.用位图填充矩形区域(FillRect) /* CBitmap bitmap; //创建一个位图 bitmap.LoadBitmap(IDB_BITMAP1);//加载位图 CBrush brush(&bitmap); //创建画刷 CClientDC dc(this); //创建DC dc.FillRect(CRect(dian,point),&brush);//填充矩形区域,矩形 画刷指针 */ b.用画刷填充矩形区域(FillRect) /* CBrush brush(RGB(0,255,0)); //创建一个画刷 CClientDC dc(this); //创建DC dc.FillRect(CRect(dian,point),&brush);//填充矩形区域,矩形 画刷指针 */ 述表中,创建后直接•
CPen pen(PS_DASHDOT,1,RGB(20,120,20)); //创建了一支笔 风格 粗细 颜色,注意,如果使用虚线,必须将粗细小于等于1 CClientDC dc(this); //创建DC CPen *pOldpen=dc.SelectObject(&pen); //将笔选择到设备描述 表中 dc.MoveTo(dian); dc.LineTo(point); dc.SelectObject(pOldpen); //将笔选择回设备描述表中也 就是释放笔
• • • • • •
第三种画线方法(二):CWND下的CClientDC类 /* CClientDC dc(GetParent()); //GetParent() 得到的是副窗口相关的 得到的是CWnd的父 窗口指针 dc.MoveTo(m_PointBegin);// 移动到当前点,也就是画线的起点位置 dc.LineTo(point);//移动到画线的终点位置 */

第二章 MFC 绘图基础

第二章 MFC 绘图基础

本章学习目标⏹MFC上机操作步骤⏹MFC绘图方法⏹CDC类的主要绘图成员函数⏹设备上下文的调用和释放⏹双缓冲机制⏹MFC 绘制图形的几种方法本章内容2.1 MFC上机操作步骤2.2 MFC绘图方法2.3 设备上下文的调用与释放2.4 双缓冲机制2.5 MFC绘图的几种方法2.6 本章小结2.1 MFC上机操作步骤微软基类库MFC(microsoft foundation class library,MFC)是以C++形式封装的Windows API (Application Program Interface),包含了200多个已经定义好的常用基类。

在程序设计过程中,一般是通过MFC 调用基类的成员函数来完成设计任务的。

1. 从Windows的开始菜单中启动Microsoft Visual C++ 6.0,如图2-1所示。

图2-1 Visual C++启动菜单2. 在Visual C++集成开发环境中,从File|New菜单命令,弹出New对话框,切换到Projects选项卡。

如图2-2所示。

图2-2 New 对话框3. 在MFC AppWizard-Step1对话框中,选中Single Document单选按钮,其余保持默认值,如图2-3所示。

单击Finish按钮。

图2-3 MFC AppWizard-Step1 对话框4. 弹出New Project Information对话框。

如图2-4所示。

单击OK按钮。

图2-4 New Project Information 对话框5. 完成上述步骤后,Test工程的MFC应用程序框架已经生成。

如图2-5所示。

图2-5 应用程序框架6. 在应用程序框架的ClassView标签页中显示所创建的类和成员函数;在ResourceView标签页板中显示所创建的资源;在FileView标签页中显示源程序文件。

如图2-6所示。

图2-6 应用程序框架的三个标签页显示标签页:从ClassView标签页可以看出,CTestApp是应用的主函数类,用来处理消息。

MFC画图的基本方法

MFC画图的基本方法

MFC画图的基本方法1.画笔类,CPen,创建画笔类的对象后,需要调用CreatePen(......)函数创建画笔。

然后将其选入设备描述表中。

pDC->SelectObject(.......);2.设置起点坐标。

在这里调用一个函数来设置坐标原点。

pDC->SetViewportOrg(100,255);3.调用LineTo(point),MoveTo(Point)函数画图。

4.删除创建的画笔对象。

pen.DeleteObject();以下是今天所写的画正弦函数的图像。

创建一个单文档的应用程序。

并且在VIEW类中的OnDraw(。

)函数里面做消息响应。

由于调用了sin()函数,所以要把math.h头文件包含进来。

#include "math.h"void CDrawSinXView::OnDraw(CDC* pDC){CDrawSinXDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data here//建立画笔CPen pen_Zuobixi,pen_sinx;pen_Zuobixi.CreatePen(PS_SOLID,4,RGB(0,0,0));pen_sinx.CreatePen(PS_SOLID,2,RGB(0,0,255));pDC->SelectObject(&pen_Zuobixi);//指定原点pDC->SetViewportOrg(100,255);pDC->SetTextColor(RGB(255,0,0));//绘制横坐标CString sPIText[]={"-1/2π","","1/2π","π","3/2π","2π","5/2π","3π","7/2π","4π","9/2π","5π"};int n=-1;int nTemp=0;while (nTemp<=660){pDC->LineTo(60*n,0);pDC->LineTo(60*n,-5);pDC->MoveTo(60*n,0);pDC->TextOut(60*n-sPIText[n+1].GetLength()*3,16,sPIText[n+1]);n++;nTemp +=60;}pDC->MoveTo(0,0);CString strTemp;//绘制纵坐标for(n=-4,nTemp = 0;nTemp<=180;n++,nTemp+=60) {pDC->LineTo(0,60*n);pDC->LineTo(5,60*n);pDC->MoveTo(0,60*n);strTemp.Format("%d",-n);pDC->TextOut(10,60*n,strTemp);}double y,radian;pDC->SelectObject(&pen_sinx);for(int x=-60;x<600;x++){//弧度=X坐标/曲线宽度*角系数*π//Y坐标=振幅*曲线宽度*sin(弧度)radian =x/((double)60*2)*PI;y=sin(radian)*2*60;pDC->MoveTo((int)x,(int)y);pDC->LineTo((int)x,(int)y);}pen_sinx.DeleteObject();。

MFC绘图基础.

MFC绘图基础.

MFC绘图基础.先认识⼀下MFC中的⼀些和绘图有关的结构体和类1.点(1)点结构POINT点数据结构POINT⽤来表⽰⼀点的x、y坐标:typedef struct tagPOINT {LONG x;LONG y;} POINT;(2)点类CPoint点类CPoint为⼀个没有基类的独⽴类,封装了POINT结构,有成员变量x和y其构造函数有5种:CPoint( );CPoint( int initX, int initY );CPoint( POINT initPt );CPoint( SIZE initSize );CPoint( LPARAM dwPoint );// 低字设为x、⾼字设为yCPoint类还定义了4个平移和设置函数:void Offset(int xOffset, int yOffset);void Offset(POINT point);void Offset(SIZE size);void SetPoint(int X, int Y);CPoint类还重载了+、-、+=、-=、==、!=等运算符来⽀持CPoint对象和CPoint、POINT、SIZE对象之间的运算。

2.⼤⼩(1)⼤⼩结构SIZE⼤⼩(size尺⼨)结构SIZE⽤来表⽰矩形的宽cx和⾼cy:typedef struct tagSIZE {LONG cx;LONG cy;} SIZE(2)⼤⼩类CSize⼤⼩类CSize也为⼀个没有基类的独⽴类,封装了SIZE结构,有成员变量cx和cy其构造函数也有5种:CSize( );CSize( int initCX, int initCY );CSize( SIZE initSize );CSize( POINT initPt );CSize( DWORD dwSize ); // 低字设为cx、⾼字设为cyCSizet类也重载了+、-、+=、-=、==、!=等运算符来⽀持CSize对象和CSize、POINT、SIZE、RECT对象之间的运算3.矩形(1)矩形结构RECT矩形结构RECT定义了矩形的左上⾓与右下⾓的坐标:typedef struct tagRECT {LONG left;LONG top;LONG right;LONG bottom;} RECT;(2)矩形类CRect矩形类CRect也为⼀个没有基类的独⽴类,封装了RECT结构,有成员变量left、top、right和bottom其构造函数有6种:CRect( );CRect( int l, int t, int r, int b );CRect( const RECT& srcRect );CRect( LPCRECT lpSrcRect );CRect( POINT point, SIZE size );CRect( POINT topLeft, POINT bottomRight );CRect类重载了=,+、-,+=、-=,==、!=,&、|,& =、|=等运算符来⽀持CRect对象和CRect、POINT、SIZE、RECT对象之间的运算。

第三章MFC绘图

第三章MFC绘图

7/22/2013
18
6.OnDraw与OnPaint的区别
OnDraw是CView类的成员函数,不响应消息;OnPaint是 CWnd类的成员函数,响应WM_PAINT消息。 CView默认调用的OnPaint函数如下
void CView::OnPaint() { CPaintDC dc(this); OnPrepareDC(&dc); OnDraw(&dc); //调用了OnDraw }
3.4重绘
为什么要重绘? 如何重绘? 在ondraw中重新绘制窗口内容: 把OnLButtonDown事件中的绘制图形 代码写在ondraw函数中。
7/22/2013
28
新的问题: 1)程序一开始就把OnLButtonDown事件 中绘制的图形画好了。 解决办法: 使用if控制:如果没有发生 OnLButtonDown事件,则不在ondraw中 重绘。 怎么实现?
文本:以图形方式输出文本,以逻辑坐标为单位计算输 出位置,而DOS是以行为单位。用户可以设置文本的各 种效果,如加粗、斜体、设置颜色等。
7/22/2013
3
2.设备上下文
应用程序的输出面向设备环境(Device Context,DC),是 一个虚拟逻辑设备,也称设备描述表或设备上下文。设备 环境DC 是由GDI 创建,用来代表设备连接的数据结构。 DC 的主要功能
7/22/2013
17
5.Windows系统发送WM_PAINT消息的时机
第一次创建一个窗口时 改变窗口的大小时 把窗口从另一个窗口背后移出时 窗口显示数据变化时,应用程序引发重绘操作
通过CWnd::Invalidate、CWnd::InvalidateRect或 CWnd::InvalidateRgn函数把指定区域加到窗口的 Update Region中。 窗口的Update Region不为空时,系统会自动产生 WM_PAINT消息。

MFC中简单绘图控制

MFC中简单绘图控制

MFC中简单绘图控制首先建立Graphic2单文档应用程序,在菜单栏帮助菜单后面,新建名为绘图的菜单项,并在其下面新建四个子菜单:IDM_DOT点, IDM_LINE直线,IDM_RECTANGLE矩形, IDM_ELLIPSE椭圆,并在视类中添加其对应的响应函数。

同时添加一变量:private: int m_pt用以标志用户的选择。

点:m_pt=1;直线:m_pt=2,矩形:m_pt=3;椭圆:m_pt=4。

再添加鼠标左键按下和弹起响应函数。

再添加一成员变量,用以保存左键按下时的坐标:private:CPoint m_ptOrigin;void CGraphic2View::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultm_ptOrigin=point;CView::OnLButtonDown(nFlags, point);}void CGraphic2View::OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default CClientDC dc(this);CPen pen;//设定画笔pen.CreatePen(PS_SOLID,2,RGB(255,0,0));CPen *pOldpen=dc.SelectObject(&pen);CBrush*Brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//设定透明画刷CBrush *pOldBrush=dc.SelectObject(Brush);switch(m_pt){case 1:dc.SetPixel(point,RGB(255,0,0));break;case 2:dc.MoveTo(m_ptOrigin);dc.LineTo(point.x,point.y);break;case 3:dc.Rectangle(CRect(m_ptOrigin,point));break;case 4:dc.Ellipse(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);break;}dc.SelectObject(&pOldpen);dc.SelectObject(&pOldBrush);CView::OnLButtonUp(nFlags, point);}CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));CBrush::FromHa ndle:Returns a pointer to a CBrush object when given a handle to a Windows HBRUSH object.这个函数的意义是将从windows返回的HBrush句柄转换成一个CBrush的指针,这里有一个问题那就是GetStockObject返回的句柄不是HBrush 的,而是HGDIOBJ的,因此我们还需要进行强制转化.改变线宽:首先新建一对话框:ID=IDM_DLG_SETTING;caption=setting;添加一静态文本:caption=线宽;添加一编辑框:ID=IDM_LINE_WIDTH.建立一个与对话框对应的类,类名为CSettingDlg。

MFC处理绘图

MFC处理绘图

(一)简单的图形输出1 、点: pDC->SetPixel(C point(200,200),RGB(255,0,0,)); // 在 [200 , 200] 的位置画一个红点2 、线: pDC->MoveTo(0,0); // 直线起点的坐标为( 0 , 0 )pDC->LineTo(100,100) // 从起点( 0 , 0 )到终点( 100 , 100 )画一条直线3 、矩形: Crect rect(0,0,100,100);pDC->Rectangle(&rect); // 画一个长 100 ,宽 100 的矩形4 、圆和椭圆:Crect rect(0,0,100,100);pDC->Ellipse(&rect);Crect rect(0,0,50,100);pDC->Ellipse(&rect);5 、多边形:CPoint poly[4];poly[0]=CPoint(0,0);poly[1]=CPoint(50,50);poly[2]=Cpoint(50,100);poly[3]=Cpoint(0,50);pDC->Polygon(poly,4);(二)库存对象库存对象是由操作系统维护的用于绘制屏幕的常用对象,包括库存画笔、画刷、字体等。

使用SelectStockObject() 函数可以直接选择库存对象,修改系统默认值。

例如,在视图中选用画笔和画刷库存对象来画图。

Void Cexam3_3View::OnDraw(CDC*pDC){Cexam3_2Doc*pDoc=GetDocument();CRect rect;Rect.SetRect(Cpoint(0,0),Cpoint(200,200));pDC->SelectStockObject(WHITE_PEN); // 选用白色画笔pDC->SelectStockObject(GRAY_BRUSH);// 选用灰色画刷pDC->Rectangle(rect);pDC->MoveTo(0,0);pDC->LineTo(200,200);pDC->MoveTo(0,200);pDC->LineTo(200,0);}(三)创建和使用自定义画刷和画笔1 、创建 CPen 的的方法:•定义时直接创建Cpen MyPen(PS_SOLID,2,RGB(255,0,0));(2) 定义 Cpen 对象,再调用 CreatePen() 函数Cpen pen;Pen.CreatePen(PS_SOLID,2,RGB(255,0,0));2 、创建画刷的方法:(1)创建实心画刷的 CreateSolidBrush() 函数Cbrush bs;Bs.CreateSolidBrush(RGB(255,0,0));(2)创建带阴影的画刷的 CreateHatchBrush() 函数Bs.CreateHatchBrush(HS_CROSS,RGB(255,0,0));// 创建一个带十字阴影的红色画刷(3)创建位图画刷的 CreatePatternBrush() 函数本函数的应用如下:CbitMap bmp;Bmp.LoadBitMap(IDB_MYBITMAP);Cbrush bs;Bs.CreatePatternBrush(&bmp);例4_3、在视图中绘制三个图形,一个用阴影风格的画刷画的椭圆形,一个用深兰色实心画刷画的圆角矩形,一个用浅灰色画刷画的饼形。

MFC基本绘图—简单画图工具开发

MFC基本绘图—简单画图工具开发


两个参数分别表示:刷子的填充样式,刷子的颜色。
构造函数: CBrush( COLORREF crColor ) CBrush( int nIndex ,COLORREF crColor)
nIndex填充样式的6种风格
水平线 竖直线 向下斜线 向上斜线 十字线 交叉线

HS_HORIZONTAL HS_VERTICAL HS_BDIAGNAL HS_FDIAGONAL HS_CROSS HS_DIAGCROSS
pDC->SelectObject(&DrawBrush);
pDC->Rectangle(rc); //绘制带有填充样式的矩形 pDC->SelectObject(pOldBrush); }
实验步骤指导
1.应用AppWizard向导生成一个单文档应用程序 2. 增加若个按钮控制绘图工具和相关设置。
0 1 2 3 4 5
void CListDlg::Draw()
{
CWnd* pWnd=GetDlgItem(IDC_STATIC_DRAW); CDC* pDC=pWnd->GetDC();
CBrush BkBrush, DrawBrush;
BkBrush.CreateSolidBrush(m_BkColor); DrawBrush.CreateHatchBrush(m_DrawPattern, m_ForeColor);

具体要求: a. 工具选择按钮: 直线 矩形 b.画笔颜色设置 RGB设置,利用edit设置 c.笔刷设置 RGB设置,利用edit设置

3. 增加消息相应处理函数完成绘图功能。
具体要求: a. 工具选择按钮: 直线 矩形 b.画笔颜色设置 RGB设置,利用edit设置 宽度 样式 c.笔刷设置 RGB设置,利用edit设置

实验一 MFC基本绘图

实验一 MFC基本绘图

数学与计算科学系学生实验报告实验课程名称:计算机图形学实验内容:实验一 MFC基本绘图系别:年级:专业班:学生姓名:学号:开课时间:年下学期一、实验要求1. 按照教材第40页2.2节所介绍的操作步骤,熟悉MFC应用程序的创建过程,并完成第50页的例2-5。

2.在上面程序的基础上,通过设置不同的画笔和画刷,至少实现8个不同图形的绘制,如:椭圆、矩形、实线、虚线、位图显示、五角星(多边形)、圆弧、扇形、Bezier曲线等等。

二、实验过程1.启动Visval 6.0++,创建MFC单文档工程。

2. 在MFC的OnDraw(CDC* pDC)中“ // TODO: add draw code for native data here”下进行编程。

3.建立直角坐标系,并标出x,y轴和原点O。

4.在坐标系里画图。

5.用图片填充背景时要先将图片导入MFCresources中。

6.画五角星时在头文件中加入以下代码:#include "math.h"#define PI 3.1415926#define Round(d) int(floor(d+0.5))三、程序代码void CMywork1View::OnDraw(CDC* pDC){CMywork1Doc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereCRect rect;//定义矩阵GetClientRect(&rect);//获得客户区矩阵pDC->SetMapMode(MM_ANISOTROPIC);//设置映射模式pDC->SetWindowExt(100,100);//设置窗口pDC->SetViewportExt(100,100);//设置视区:x轴水平向右为正,y轴垂直向上为正pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);//设置客户区中心为坐标系原点rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);//客户区矩阵校正//建立坐标系CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,1,RGB(0,255,0));//画实线,选择绿色画笔pOldPen=pDC->SelectObject(&NewPen);pDC->MoveTo(-rect.right,0); //自定义坐标轴pDC->LineTo(rect.right,0);pDC->MoveTo(0,-rect.bottom);pDC->LineTo(0,rect.bottom);pDC->MoveTo(rect.right,0); //画x轴的箭头pDC->LineTo(rect.right-10,-7);pDC->MoveTo(rect.right,0); //画x轴的箭头pDC->LineTo(rect.right-10,7);pDC->MoveTo(0,-rect.bottom); //画y轴的箭头pDC->LineTo(7,10-rect.bottom);pDC->MoveTo(0,-rect.bottom); //画y轴的箭头pDC->LineTo(-7,10-rect.bottom);pDC->TextOut(rect.right-15,5,"x"); //显示x轴pDC->TextOut(25,15-rect.bottom,"y"); //显示y轴pDC->TextOut(-15,10,"O"); //显示原点//直线---画实线1CPoint A(50,50),B(450,300);CPen NewPen1,*pOldPen1;NewPen1.CreatePen(PS_SOLID,1,RGB(0,225,225));//画实线,选择青色画笔pOldPen1=pDC->SelectObject(&NewPen1);pDC->MoveTo(A);pDC->LineTo(B);pDC->SelectObject(pOldPen1);pDC->TextOut(50,50,'A');pDC->TextOut(450,300,'B');pDC->TextOut(200,200,"实线");//直线---画虚线2CPoint C(300,150),D(600,100);CPen NewPen2,*pOldPen2;NewPen2.CreatePen(PS_DASH,1,RGB(225,0,0));//画虚线,选择红色画笔pOldPen2=pDC->SelectObject(&NewPen2);pDC->MoveTo(C);pDC->LineTo(D);pDC->SelectObject(pOldPen2);pDC->TextOut(300,150,'C');pDC->TextOut(600,100,'D');pDC->TextOut(450,100,"虚线");//画椭圆3rect.DeflateRect(100,50);CBrush * pOldBrush3;pOldBrush3=(CBrush *)pDC->SelectStockObject(NULL_BRUSH);//选择透明画刷pDC->Ellipse(rect);//绘制椭圆pDC->SelectObject(pOldBrush3);//画圆角矩形4CBrush NewBrush4,*pOldBrush4;NewBrush4.CreateSolidBrush(RGB(255,0,0));pOldBrush4=pDC->SelectObject(&NewBrush4);pDC->RoundRect(-400,-200,-50,-40,40,20);pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush4);//画Bezier样条9CPoint pp[7];pp[0]=CPoint(20,-200);pp[1]=CPoint(90,-70);pp[2]=CPoint(220,-30);pp[3]=CPoint(250,-160);double a=(pp[3].y-pp[2].y)/(pp[3].x-pp[2].x);double x=270,y=a*(x-pp[3].x)+pp[3].y;pp[4]=CPoint(Round(x),Round(y));pp[5]=CPoint(480,-130);pp[6]=CPoint(400,-25);for(int j=0;j<7;j++){if(0==j)pDC->MoveTo(pp[j]);elsepDC->LineTo(pp[j]);pDC->Ellipse(pp[j].x-5,pp[j].y-5,pp[j].x+5,pp[j].y+5);//黑色实心圆绘制控制点}CPen NewPen9,*pOldPen9;NewPen9.CreatePen(PS_SOLID,3,RGB(255,0,0));//红色画笔绘制样条pOldPen9=pDC->SelectObject(&NewPen9);pDC->PolyBezier(pp,7);//绘制Bezier样条pDC->SelectObject(pOldPen9);pDC->TextOut(280,-100,"Bezier曲线");//绘制五角星6CPen penBlue(PS_SOLID,5,RGB(0,0,255));//定义五个像素宽的蓝色画笔CPen *pOldPen6=pDC->SelectObject(&penBlue);CBrush brushRed(RGB(255,0,0));//定义红色画笔CBrush * pOldBrush6=pDC->SelectObject(&brushRed);pDC->SetPolyFillMode(WINDING);//设置填充模式int r=200;//正五边形外接圆的半径CPoint p[5];//定义正五边形顶点数组double Beta=2*PI/5;//定义每个顶点的圆心角double Alpha=PI/10;//定义起始角for(int i=0;i<5;i++){p[i].x=Round(r*cos(i*Beta+Alpha));//计算正五边形顶点坐标p[i].y=Round(r*sin(i*Beta+Alpha));}CPoint v[5];//定义五角星顶点数组v[0]=p[0];v[1]=p[2];v[2]=p[4];v[3]=p[1];v[4]=p[3];//转储顶点pDC->Polygon(v,5);//绘制五角星pDC->SelectObject(pOldPen6);//恢复画笔pDC->SelectObject(pOldBrush6);//恢复画刷//画扇形7CBitmap NewBitmap7; CBrush NewBrush7,*pOldBrush7;NewBrush7.CreatePatternBrush(&NewBitmap7);//将背景图作为画刷填充扇形pOldBrush7=pDC->SelectObject(&NewBrush7);CPen *pOldPen7;pOldPen7=(CPen*)pDC->SelectStockObject(NULL_PEN);CPoint ld,rt,sp,ep;ld=CPoint(500,150),rt=CPoint(100,300);//第一个扇形的位置sp=CPoint(-100,-300),ep=CPoint(-500,-150);pDC->Pie(CRect(ld,rt),sp,ep);//画扇形函数CBrush Brush7;Brush7.CreateSolidBrush(RGB(0,255,255));//为下面的的扇形配青色pDC->SelectObject(&Brush7);ld=CPoint(-400,-170),rt=CPoint(-300,-130);//第二个扇形的位置sp=CPoint(-200,-100),ep=CPoint(-500,-100);pDC->Pie(CRect(ld,rt),sp,ep);//画获取像素图8srand((unsigned)time(NULL));//随机变量(随时间变化)COLORREF crColor;int m,n;for(n=50;n<100;n++)for(m=-100;m<-50;m++)pDC->SetPixelV(m,n,RGB(rand()%256,rand()%256,rand()%256));//生成随机像素点for(n=50;n<100;n++)for(m=-100;m<-50;m++){crColor=pDC->GetPixel(m,n);//获取原矩形区域的像素点pDC->SetPixelV(m-200,n+50,crColor);//用获取的像素点在y-90的位置生成原图}}四、实验结果。

mfc绘制函数

mfc绘制函数

mfc绘制函数MFC绘制函数MFC(Microsoft Foundation Classes)是微软公司开发的一套C++类库,用于简化Windows应用程序的开发。

MFC提供了许多绘制函数,用于在应用程序中绘制各种图形、文本和控件。

本文将介绍一些常用的MFC绘制函数及其使用方法。

一、绘制直线绘制直线是绘图中最基本的功能之一。

MFC提供了CClientDC类来实现在窗口客户区绘制图形的功能。

下面是一个绘制直线的示例代码:```CClientDC dc(this);dc.MoveTo(50, 50);dc.LineTo(200, 200);```在上面的代码中,首先创建了一个CClientDC对象dc,它表示当前窗口的客户区设备上下文。

然后通过MoveTo函数将绘图点移动到起始位置(50, 50),再通过LineTo函数绘制一条直线到终止位置(200, 200)。

二、绘制矩形绘制矩形是绘图中常用的功能之一。

MFC提供了CClientDC类的Rectangle函数来绘制矩形。

下面是一个绘制矩形的示例代码:```CClientDC dc(this);CRect rect(50, 50, 200, 200);dc.Rectangle(rect);```在上面的代码中,首先创建了一个CRect对象rect,表示矩形的位置和大小。

然后通过CClientDC的Rectangle函数绘制该矩形。

三、绘制椭圆绘制椭圆也是绘图中常用的功能之一。

MFC提供了CClientDC类的Ellipse函数来绘制椭圆。

下面是一个绘制椭圆的示例代码:```CClientDC dc(this);CRect rect(50, 50, 200, 200);dc.Ellipse(rect);```在上面的代码中,首先创建了一个CRect对象rect,表示椭圆的外接矩形。

然后通过CClientDC的Ellipse函数绘制该椭圆。

四、绘制文本绘制文本是在应用程序中显示文字的常用功能。

MFC屏幕绘图

MFC屏幕绘图
值放在 dwPoint 的高 16 位 CPoint 类重载的运算符有:==、!=、+=、-=、-、+等。
CRect 类与 RECT 数据结构类似,它还包含了用来处理 CRect 类和 RECT 结构 类型数据的成员函数。CRect 类的对象可以用在任何使用 RECT 结构、LPCRECT 和 LPRECT 数据的地方。CRect 类与 SIZE 结构和 CSIZE 类可以互相使用,因 为它们的数据结构是一样的。
1
图 4-1 窗口内的客户区与非客户区
4.1.3、绘图类
MFC 提供了不同类型的设备描述表的类(绘图类):CDC、CPaintDC、CClientDC、 CWindowDC 和 CmetafileDC。其中 CDC 类是 MFC 绘图类的根类,其它的绘图类都是 CDC 类的派生类。CDC 类包含了绘图所需的所有成员函数。其它的派生类,除了 CmetafileDC 类之外,都仅仅是构造函数和析构函数的不同。
void CTestView::FunctionName() {
// Device context for painting CClientDC pdc(this); // 用户在此添加代码。 பைடு நூலகம் CWindowDC 类的引用方法与 CClientDC 类似,“CWindowDC pdc(this);”。只是其绘
其中 x、y 表示一个点的坐标值。 矩形 RECT 数据结构:
typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom;
} RECT; 其中 left、top 表示矩形左上角的 x、y 坐标值,right、bottom 表示矩形右下角 的 x、y 坐标值。 表示矩形高宽的 SIZE 数据结构:

MFC经典绘图方法总结

MFC经典绘图方法总结

MFC经典绘图方法总结Windows 绘图的实质就是利用windows提供的图形设备接口GDI(Graphics Device Interface)将图形会制在显示器上。

为了支持GDI绘图,MFC提供了两种重要的类:设备上下文DC(Device Context)类,用于设置绘图属性和绘制图形;绘图对象类,封装了各种GDI绘图对象,包括画笔、刷子、字体、位图、调色板和区域。

CDC类介绍:在MFC中,CDC是设备上下文类的基类,派生类包括:CClientDC, CPaintDC, CWindowDC, CMetaFileDC类CClientDC 客户区设备上下文,绘制客户区时CPaintDC 一般发生在窗口需要重绘时CWindwDC 可以绘制整个窗口,通常在窗口WM_NCPAINT消息的响应函数CWnd::OnNCPaint()中使用CMetaFileDC 专门用于图元文件的绘制,图元文件记录一组GDI命令,重建图形输出。

CDC包含m_hDC和m_hAttribDC二个设备上下文。

CDC指导所有对m_hDC的输出GDI调用(SetTextColor)以及对m_hAttribDC的大部分属性GDI调用(GetTextColor)。

CDC对象的重要函数如下:1、为指定设备创建上下文virtual BOOL CreateDC(...)比如创建一个为屏幕的设备上下文CDC dc;dc.CreateDC("DISPLAY", NULL, NULL,NULL);2、创建内存设备上下文,与指定设备上下文兼容virtual BOOL CreateCompatibleDC( CDC * pDC)3、删除CDC对象对应的Windows设备上下文, 通常不调用该函数而是使用析构程序virtual BOOL DeleteDC();4、将HDC句柄转化为设备上下文的句柄: CDC *pDC=CDC::FromHandle( hDC )5、选择GDI对象入选到设备上下文中,一共有五种形式:CPen * SelectObject( CPen * pPen) ;CBrush * SelectObject( CBrush * pBrush) ;virtual CFont * SelectObject( CFont * pFont) ;CBitmap * SelectObject( CBitmap * pBitmap) ;int SelectObject( CRgn * pRgn) ;例:Cpen cpen;pen.CreatePen( PS_SOLID, 2, RGB(255,0,0) );Cpen *pOldPen=(CPen*)pDC->SelectObject(&pen); //设置新画笔,记录旧画笔....pDC->SelectObject(pOldPen); //还原画笔三种方法创建画笔1/构造函数:CPen();CPen( int nPenStyle, int nWidth, COLORREF crColor );CPen(...)略2/CreatePen( int nPenStyle, int nWidth, COLORREF crColor )3/CreatePenIndirect( LPLOGPEN lpLogpen )typedef struct tagLOGPEN{UINT lopnStyle;POINT lopnWidth;COLORREF lopnColor;}LOGPEN, *LPLOGPEN;例:LOGPEN lppn;lppn.lopnColor=RGB(255,0,0);lppn.lopnStype=PS_DASHDOT;lgpn.lopnWidth.x=2;lgpn.lopnWidth.y=2;CPen pen;pen.CreatePenIndirect( &lppn );画刷三种方法创建1/构造函数:CBrush();CBrush(COLROREF crColor);CBrush(int nIndex, COLORREF crColor);nIndex 哪种类型的网格, HS_BDIAGONAL HS_CROSSHS_VERTICAL HS_HORIZONTAL2/CreateSolidBrush( COLORREF crColor);3/CreateHatchBrush( int nIndex , COLORREF crColor );4/CreateBrushIndirect( const LOGBRUSH* lpLogBrush );typedef struct tagBRUSH{UINT lbStyle; // BS_HA TCHED, BS_SOLID , BS_NULLCOLORREF lopnColor;LONG lbHatch; //HS_BDIAGONAL HS_CROSS HS_VERTICAL HS_HORIZONTAL}LOGBRUSH, *LPLOGBURSH;例:CRect Rect(0,0,200,200);CBrush brush(HS_HORIZONTAL,RGB(0,255,0));CBrush *pOldBursh=pDC->SelectObject(&brush);pDC->Rectangle(Rect);pDC->SelectObject( pOldBursh);图形绘制1.点绘制//返回RGB值COLORREF SetPixel(int x, int y, COLORREF crColor);COLORREF SetPixel(POINT point, COLORREF crColor);//返回BOOL值,绘制是否成功.BOOL SetPixelV(int x, int y, COLORREF crColor);BOOL SetPixelV(POINT point, COLORREF crColor);2.直线绘制//返回CPoint对象的x和y坐标的前一次取值CPoint MoveTo(int x, int y);CPoint MoveTo(POINT point);//返回绘制是否成功BOOL MoveTo(int x, int y);BOOL MoveTo(POINT point);例:CPen pen;pen.CreatePen(PS_SOLID,2,RGB(0,255,0));CPen* oldPen =(CPen *)pDC->SelectObject(&pen);CPoint oldPoint=pDC->MoveTo(600,300);pDC->LineTo(500,500);3.矩形绘制1/矩形绘制BOOL Rectangle( int x1, int y1, int x2, int y2 );BOOL Rectangle( LPRECT lpRect);例:pDC->SelectObject( oldPen);pDC->Rectangle(0,0,600,300);CRect Rect(0,0,300,200);CBrush brush(HS_HORIZONTAL,RGB(0,255,0));CBrush *pOldBursh=pDC->SelectObject(&brush);pDC->Rectangle( &Rect );pDC->SelectObject( pOldBursh);例:CPen pen;pen.CreatePen(PS_DASH, 1,RGB(255,0,0));LOGBRUSH lb;memset( &lb,0, sizeof(lb));lb.lbStyle=BS_HATCHED;lb.lbHatch=HS_DIAGCROSS;CBrush brush;brush.CreateBrushIndirect( &lb);CPen *pOldPen=(CPen *)pDC->SelectObject( & pen);CBrush *pOldBrush=(CBrush*)pDC->SelectObject(&brush);pDC->Rectangle(0,0,200,200);pDC->SelectObject( pOldPen);pDC->SelectObject( pOldBrush);2/三维矩形线框绘制void Draw3dRect(int x, int y, int cx, int cy , COLORREF clrTopLeft, COLORBEF clrBottomRight );void Draw3dRect(LPCRECT lpRect, COLORREF clrTopLeft, COLORBEF clrBottomRight );例:pDC->Draw3dRect(100, 100, 200, 300, RGB(255,0,0), RGB(0,255,0));3/表示焦点风格矩形void DrawFocusRect( LPCRECT lpRect);例:CRect rt( 400,400, 450, 450);pDC->DrawFocusRect( &rt);4/绘制拖曳形线框void DrawDragRect(LPCRECT lpRect , SIZE size LPCRECT lpRectLast, SIZE sizeLast, CBrush* pBrush=NULL , CBrush* pBrushLast=NULL);5/圆角矩形void RoundRect(LPCRECT lpRect , POINT point); //point.x 椭圆宽, point.y 椭圆高void RoundRect(int x1, int y1, int x2, int y2, int x3, int y3 );例:pDC->RoundRect(250, 250, 400, 400, 50, 100);4.椭圆绘制BOOL Ellipse( LPCRECT lpRect ) //椭圆的外接矩形范围文字绘制TextOut函数返回值是BOOLBOOL TextOut( int x, int y, const CString & str );virtual BOOL TextOut(int x, int y, LPCSTR lpszString, int nCount);DrawText函数返回值是文本高度int DrawText ( LPCSTR lpszString, int nCount, LPRECT lpRect, UNIT nFormat);int DrawText ( const CString& str, LPRECT lpRect, UNIT nFormat); //DT_BOTTOM DT_LEFT...//注意:如果nFormat 参数指定了DT_CALCRECT标志,由lpRect指定的矩形将会更新,以反映显示文本需要的高度和宽度,但并不绘制显示文字背景色和前景色virtual COLORREF SetBKColor( COLORREF crColor);int SetBKMode( int nBKMode); // nBKMode: OPAQUE, TRANSPARENT时,SetBKColor失效例:CRect rect;GetClientRect(&rect);pDC->FillSolidRect(rect,RGB(0,0,255));CString strText=L"VC++ BKColor Demo...";pDC->SetTextColor(RGB(255,255,255));pDC->SetBkColor(RGB(255,0,0));pDC->SetBkMode(TRANSPARENT);pDC->TextOut(10,10,strText);文字字体设置文字的字体会使用到MFC下的CFont类,然后调用CFont类下的四个成员函数: CreateFont, CreateFontIndirect, CreatePointFont和CreatePointFontIndirect,详见msdn帮助例:1/CreateFont 函数CFont font;font.CreateFont(25,0,1800,0,FW_BOLD,1,1,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,L"Courier New");CString strText=L"VC++ Font Demo...";pDC->SetTextColor( RGB(255,0,0));CFont *pOldFont=(CFont*)pDC->SelectObject(&font);pDC->TextOut(210,210, strText);pDC->SelectObject(pOldFont);2/ CreateFontIndirect(const LOGFONT* lpLogFont);typedef struct tagLOGFONT{//14个成员变量与世隔绝CreateFont函数类似}LOGFONT;3/如果只注重字体的高度和字体名时,使用CreatePointFont(int nPointSize, LPCSTR lpszFaceName, CDC* pDC=NULL);位图显示A:位图介绍,CBitmap类封装了Windows图形设备接口中的位图,并提供了操作位图的成员函数1/创建兼容位图,使之与指定设备兼容.BOOL CreateCompatibleBitmap(CDC *pDC, int nWidth, int nHeight);2/得到位图信息,作用是填充BITMAP结构.int GetBitmap(BITMAP * pBitMap);3/加载位图资源,加载一个命名的位图资源来初始化位图对象.BOOL LoadBitmap( LPCSTR lpszResourceName);BOOL LoadBitmap( UINT nIDResuource );B:显示位图,VC++提供BitBlt, StretchBlt和TransparentBit(需加入msimg32.lib库) 1/ BOOL BitBlt(int x , int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );//尺寸不变2/ BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC,int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop); //支持缩放/* dwRop一般设置为SRCCOPY */3/ BOOL TransparentBlt( HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest,HDC hdcSrc, int nXoriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent);例:CBitmap bitmap;bitmap.LoadBitmap(IDB_BITAMBOW);BITMAP bm;bitmap.GetBitmap(&bm);CDC MemDC;MemDC.CreateCompatibleDC(pDC);CBitmap* pOldBitmap=(CBitmap *)MemDC.SelectObject(&bitmap);CRect rect(10,10, bm.bmWidth, bm.bmHeight);TransparentBlt(pDC->GetSafeHdc(), rect.left, rect.top, rect.Width()*5, rect.Height()*5, MemDC.GetSafeHdc(), 0, 0, bm.bmWidth, bm.bmHeight, RGB(0,0,0));//长宽扩大5倍,图片中黑色的部分将作为透明处理。

MFC绘图总结(2):客户区大小和DC求索阁

MFC绘图总结(2):客户区大小和DC求索阁

MFC绘图总结(2):客户区大小和DC求索阁在绘图前,必须先得到客户区大小和设备上下文DC。

1.获得客户区绘图一般都是在视图窗口的客户区进行,而客户区的大小在运行时可由用户改变,为了使绘制的图形能随窗口大小自动改变,必须先得到当前客户区大小的数据(宽w和高h)。

获取客户区大小的方法有如下两种:1)在消息响应函数OnSize中获得利用属性窗口的信息页,在视图类中添加WM_SIZE消息的响应函数OnSize。

该函数在窗口第一次显示或窗口大小被改变时会被Windows系统调用。

其输入参数中的cx和cy就是客户区大小的宽和高,可将它们赋值给类变量(如m_iW和m_iH)供绘图时使用。

例如void CDrawView::OnSize(UINT nType, int cx, int cy) {CView::OnSize(nType, cx, cy);// TODO: 在此处添加消息处理程序代码m_iW = cx; m_iH = cy;}其中,nType的值为:<!--[if !supportLists]-->l <!--[endif]-->SIZE_MAXIMIZED(窗口已被最大化)<!--[if !supportLists]-->l <!--[endif]-->SIZE_MINIMIZED(窗口已被最小化)<!--[if !supportLists]-->l <!--[endif]-->SIZE_RESTORED(窗口已被改变大小)<!--[if !supportLists]-->l <!--[endif]-->SIZE_MAXHIDE(其他窗口被最大化)<!--[if !supportLists]-->l <!--[endif]-->SIZE_MAXSHOW(其他窗口从最大化还原)2)调用成员函数GetClientRect得到可在绘图前,定义一个矩形变量rect,然后再调用CWnd类的成员函数GetClientRect:void GetClientRect( LPRECT lpRect ) const;得到当前客户区矩形的数据,其中的右(right)与底(bottom)就是客户区的宽与高(其左left与顶top都为0)。

MFC绘图总结(5):设置绘图属性求索阁

MFC绘图总结(5):设置绘图属性求索阁

MFC绘图总结(5):设置绘图属性求索阁除了映射模式外,还有许多绘图属性可以设置,如背景、绘图方式、多边形填充方式、画弧方向、刷原点等。

1.背景1)背景色当背景模式为不透明时,背景色决定线状图的空隙颜色(如虚线中的空隙、条纹刷的空隙和文字的空隙),可以使用CDC类的成员函数GetBkColor和SetBkColor来获得和设置当前的背景颜色:COLORREF GetBkColor( ) const; // 返回当前的背景色virtual COLORREF SetBkColor( COLORREF crColor ); // 返回先前的背景色// 若出错返回0x800000002)背景模式背景模式影响有空隙的线状图的空隙(如虚线中的空隙、条纹刷的空隙和文字的空隙)用什么办法填充。

可以使用CDC类的成员函数GetBkMode和SetBkMode来获得和设置当前的背景模式:int GetBkMode( ) const; // 返回当前背景模式int SetBkMode( int nBkMode ); // 返回先前背景模式背景模式的取值2. 绘图模式绘图模式(drawing mode)指前景色的混合方式,它决定新画图的笔和刷的颜色(pbCol)如何与原有图的颜色(scCol)相结合而得到结果像素色(pixel)。

1)设置绘图模式可使用CDC类的成员函数SetROP2 (ROP = Raster OPeration 光栅操作)来设置绘图模式:int SetROP2( int nDrawMode );其中,nDrawMode可取值:绘图模式nDrawMode的取值其中,R2_COPYPEN(覆盖)为缺省绘图模式,R2_XORPEN (异或)较常用。

2)画移动图形为了能画移动的位置标识(如十字、一字)和随鼠标移动画动态图形(如直线、矩形、椭圆),必须在不破坏原有背景图形的基础上移动这些图形。

移动图形采用的是异或画图方法,移动图形的过程为:异或画图、在原位置再异或化图(擦除)、在新位置异或画图、……。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MFC经典绘图方法总结Windows 绘图的实质就是利用windows提供的图形设备接口GDI(Graphics Device Interface)将图形会制在显示器上。

为了支持GDI绘图,MFC提供了两种重要的类:设备上下文DC(Device Context)类,用于设置绘图属性和绘制图形;绘图对象类,封装了各种GDI绘图对象,包括画笔、刷子、字体、位图、调色板和区域。

CDC类介绍:在MFC中,CDC是设备上下文类的基类,派生类包括:CClientDC, CPaintDC, CWindowDC, CMetaFileDC类CClientDC 客户区设备上下文,绘制客户区时CPaintDC 一般发生在窗口需要重绘时CWindwDC 可以绘制整个窗口,通常在窗口WM_NCPAINT消息的响应函数CWnd::OnNCPaint()中使用CMetaFileDC 专门用于图元文件的绘制,图元文件记录一组GDI命令,重建图形输出。

CDC包含m_hDC和m_hAttribDC二个设备上下文。

CDC指导所有对m_hDC的输出GDI调用(SetTextColor)以及对m_hAttribDC的大部分属性GDI调用(GetTextColor)。

CDC对象的重要函数如下:1、为指定设备创建上下文virtual BOOL CreateDC(...)比如创建一个为屏幕的设备上下文CDC dc;dc.CreateDC("DISPLAY", NULL, NULL,NULL);2、创建内存设备上下文,与指定设备上下文兼容virtual BOOL CreateCompatibleDC( CDC * pDC)3、删除CDC对象对应的Windows设备上下文, 通常不调用该函数而是使用析构程序virtual BOOL DeleteDC();4、将HDC句柄转化为设备上下文的句柄: CDC *pDC=CDC::FromHandle( hDC )5、选择GDI对象入选到设备上下文中,一共有五种形式:CPen * SelectObject( CPen * pPen) ;CBrush * SelectObject( CBrush * pBrush) ;virtual CFont * SelectObject( CFont * pFont) ;CBitmap * SelectObject( CBitmap * pBitmap) ;int SelectObject( CRgn * pRgn) ;例:Cpen cpen;pen.CreatePen( PS_SOLID, 2, RGB(255,0,0) );Cpen *pOldPen=(CPen*)pDC->SelectObject(&pen); //设置新画笔,记录旧画笔....pDC->SelectObject(pOldPen); //还原画笔三种方法创建画笔1/构造函数:CPen();CPen( int nPenStyle, int nWidth, COLORREF crColor );CPen(...)略2/CreatePen( int nPenStyle, int nWidth, COLORREF crColor )3/CreatePenIndirect( LPLOGPEN lpLogpen )typedef struct tagLOGPEN{UINT lopnStyle;POINT lopnWidth;COLORREF lopnColor;}LOGPEN, *LPLOGPEN;例:LOGPEN lppn;lppn.lopnColor=RGB(255,0,0);lppn.lopnStype=PS_DASHDOT;lgpn.lopnWidth.x=2;lgpn.lopnWidth.y=2;CPen pen;pen.CreatePenIndirect( &lppn );画刷三种方法创建1/构造函数:CBrush();CBrush(COLROREF crColor);CBrush(int nIndex, COLORREF crColor);nIndex 哪种类型的网格, HS_BDIAGONAL HS_CROSSHS_VERTICAL HS_HORIZONTAL2/CreateSolidBrush( COLORREF crColor);3/CreateHatchBrush( int nIndex , COLORREF crColor );4/CreateBrushIndirect( const LOGBRUSH* lpLogBrush );typedef struct tagBRUSH{UINT lbStyle; // BS_HA TCHED, BS_SOLID , BS_NULLCOLORREF lopnColor;LONG lbHatch; //HS_BDIAGONAL HS_CROSS HS_VERTICAL HS_HORIZONTAL}LOGBRUSH, *LPLOGBURSH;例:CRect Rect(0,0,200,200);CBrush brush(HS_HORIZONTAL,RGB(0,255,0));CBrush *pOldBursh=pDC->SelectObject(&brush);pDC->Rectangle(Rect);pDC->SelectObject( pOldBursh);图形绘制1.点绘制//返回RGB值COLORREF SetPixel(int x, int y, COLORREF crColor);COLORREF SetPixel(POINT point, COLORREF crColor);//返回BOOL值,绘制是否成功.BOOL SetPixelV(int x, int y, COLORREF crColor);BOOL SetPixelV(POINT point, COLORREF crColor);2.直线绘制//返回CPoint对象的x和y坐标的前一次取值CPoint MoveTo(int x, int y);CPoint MoveTo(POINT point);//返回绘制是否成功BOOL MoveTo(int x, int y);BOOL MoveTo(POINT point);例:CPen pen;pen.CreatePen(PS_SOLID,2,RGB(0,255,0));CPen* oldPen =(CPen *)pDC->SelectObject(&pen);CPoint oldPoint=pDC->MoveTo(600,300);pDC->LineTo(500,500);3.矩形绘制1/矩形绘制BOOL Rectangle( int x1, int y1, int x2, int y2 );BOOL Rectangle( LPRECT lpRect);例:pDC->SelectObject( oldPen);pDC->Rectangle(0,0,600,300);CRect Rect(0,0,300,200);CBrush brush(HS_HORIZONTAL,RGB(0,255,0));CBrush *pOldBursh=pDC->SelectObject(&brush);pDC->Rectangle( &Rect );pDC->SelectObject( pOldBursh);例:CPen pen;pen.CreatePen(PS_DASH, 1,RGB(255,0,0));LOGBRUSH lb;memset( &lb,0, sizeof(lb));lb.lbStyle=BS_HATCHED;lb.lbHatch=HS_DIAGCROSS;CBrush brush;brush.CreateBrushIndirect( &lb);CPen *pOldPen=(CPen *)pDC->SelectObject( & pen);CBrush *pOldBrush=(CBrush*)pDC->SelectObject(&brush);pDC->Rectangle(0,0,200,200);pDC->SelectObject( pOldPen);pDC->SelectObject( pOldBrush);2/三维矩形线框绘制void Draw3dRect(int x, int y, int cx, int cy , COLORREF clrTopLeft, COLORBEF clrBottomRight );void Draw3dRect(LPCRECT lpRect, COLORREF clrTopLeft, COLORBEF clrBottomRight );例:pDC->Draw3dRect(100, 100, 200, 300, RGB(255,0,0), RGB(0,255,0));3/表示焦点风格矩形void DrawFocusRect( LPCRECT lpRect);例:CRect rt( 400,400, 450, 450);pDC->DrawFocusRect( &rt);4/绘制拖曳形线框void DrawDragRect(LPCRECT lpRect , SIZE size LPCRECT lpRectLast, SIZE sizeLast, CBrush* pBrush=NULL , CBrush* pBrushLast=NULL);5/圆角矩形void RoundRect(LPCRECT lpRect , POINT point); //point.x 椭圆宽, point.y 椭圆高void RoundRect(int x1, int y1, int x2, int y2, int x3, int y3 );例:pDC->RoundRect(250, 250, 400, 400, 50, 100);4.椭圆绘制BOOL Ellipse( LPCRECT lpRect ) //椭圆的外接矩形范围文字绘制TextOut函数返回值是BOOLBOOL TextOut( int x, int y, const CString & str );virtual BOOL TextOut(int x, int y, LPCSTR lpszString, int nCount);DrawText函数返回值是文本高度int DrawText ( LPCSTR lpszString, int nCount, LPRECT lpRect, UNIT nFormat);int DrawText ( const CString& str, LPRECT lpRect, UNIT nFormat); //DT_BOTTOM DT_LEFT...//注意:如果nFormat 参数指定了DT_CALCRECT标志,由lpRect指定的矩形将会更新,以反映显示文本需要的高度和宽度,但并不绘制显示文字背景色和前景色virtual COLORREF SetBKColor( COLORREF crColor);int SetBKMode( int nBKMode); // nBKMode: OPAQUE, TRANSPARENT时,SetBKColor失效例:CRect rect;GetClientRect(&rect);pDC->FillSolidRect(rect,RGB(0,0,255));CString strText=L"VC++ BKColor Demo...";pDC->SetTextColor(RGB(255,255,255));pDC->SetBkColor(RGB(255,0,0));pDC->SetBkMode(TRANSPARENT);pDC->TextOut(10,10,strText);文字字体设置文字的字体会使用到MFC下的CFont类,然后调用CFont类下的四个成员函数: CreateFont, CreateFontIndirect, CreatePointFont和CreatePointFontIndirect,详见msdn帮助例:1/CreateFont 函数CFont font;font.CreateFont(25,0,1800,0,FW_BOLD,1,1,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,L"Courier New");CString strText=L"VC++ Font Demo...";pDC->SetTextColor( RGB(255,0,0));CFont *pOldFont=(CFont*)pDC->SelectObject(&font);pDC->TextOut(210,210, strText);pDC->SelectObject(pOldFont);2/ CreateFontIndirect(const LOGFONT* lpLogFont);typedef struct tagLOGFONT{//14个成员变量与世隔绝CreateFont函数类似}LOGFONT;3/如果只注重字体的高度和字体名时,使用CreatePointFont(int nPointSize, LPCSTR lpszFaceName, CDC* pDC=NULL);位图显示A:位图介绍,CBitmap类封装了Windows图形设备接口中的位图,并提供了操作位图的成员函数1/创建兼容位图,使之与指定设备兼容.BOOL CreateCompatibleBitmap(CDC *pDC, int nWidth, int nHeight);2/得到位图信息,作用是填充BITMAP结构.int GetBitmap(BITMAP * pBitMap);3/加载位图资源,加载一个命名的位图资源来初始化位图对象.BOOL LoadBitmap( LPCSTR lpszResourceName);BOOL LoadBitmap( UINT nIDResuource );B:显示位图,VC++提供BitBlt, StretchBlt和TransparentBit(需加入msimg32.lib库) 1/ BOOL BitBlt(int x , int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );//尺寸不变2/ BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC,int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop); //支持缩放/* dwRop一般设置为SRCCOPY */3/ BOOL TransparentBlt( HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest,HDC hdcSrc, int nXoriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent);例:CBitmap bitmap;bitmap.LoadBitmap(IDB_BITAMBOW);BITMAP bm;bitmap.GetBitmap(&bm);CDC MemDC;MemDC.CreateCompatibleDC(pDC);CBitmap* pOldBitmap=(CBitmap *)MemDC.SelectObject(&bitmap);CRect rect(10,10, bm.bmWidth, bm.bmHeight);TransparentBlt(pDC->GetSafeHdc(), rect.left, rect.top, rect.Width()*5, rect.Height()*5, MemDC.GetSafeHdc(), 0, 0, bm.bmWidth, bm.bmHeight, RGB(0,0,0));//长宽扩大5倍,图片中黑色的部分将作为透明处理。

相关文档
最新文档