windows编程 08GDI编程1绘图.docx

上传人:b****3 文档编号:2793120 上传时间:2022-11-15 格式:DOCX 页数:34 大小:150.93KB
下载 相关 举报
windows编程 08GDI编程1绘图.docx_第1页
第1页 / 共34页
windows编程 08GDI编程1绘图.docx_第2页
第2页 / 共34页
windows编程 08GDI编程1绘图.docx_第3页
第3页 / 共34页
windows编程 08GDI编程1绘图.docx_第4页
第4页 / 共34页
windows编程 08GDI编程1绘图.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

windows编程 08GDI编程1绘图.docx

《windows编程 08GDI编程1绘图.docx》由会员分享,可在线阅读,更多相关《windows编程 08GDI编程1绘图.docx(34页珍藏版)》请在冰豆网上搜索。

windows编程 08GDI编程1绘图.docx

windows编程08GDI编程1绘图

第8章GDI编程1-绘图

GDI(GraphicsDeviceInterface,图形设备接口)是Windows操作系统的传统图形子系统,负责与设备无关的图形绘制,Win32API为应用程序提供了丰富的绘图函数和功能,MFC对它们进行了C++类封装,参见图8-1。

Windows应用程序

MFC

Win32API

执行程序

用户界面(User)

图形子系统(GDI)

设备驱动程序

内核(Kernel)

图形驱动程序

硬件抽象层(HAL)

计算机硬件

图8-1GDI与Windows操作系统(其中彩色部分为操作系统)

传统GDI是随Windows1.0于1985年11月推出的,新式GDI+则是随WindowsXP于2001年10月推出的GDI的改进版,增加了α混色、渐变画刷、样条曲线、矩阵变换、图像处理、持久路径等新功能。

随WindowsVista及.NET框架3.0微软于2006年11月又推出了基于DirectX和.NET框架的全新图形子系统WPF(WindowsPresentationFoundation,视窗显示/展现基础),它统一了桌面和浏览器等客户端应用程序的图形界面,采用XAML声明式编程,将用户界面的设计和编程彻底分离开来,是Windows的下一代GUI显示系统。

本书从第8章到第11章,将详细讨论如何使用GDI进行传统的Windows图形编程,包括绘图、文字、图像、动画、图标、图元文件和打印等内容。

GDI+是建立在GDI之上的,计划在第14章中简单介绍。

WPF则是以.NET框架为基础的,准备在第18章中再加以讨论。

在MFC应用程序中,绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw中进行,例如:

voidCDrawView:

:

OnDraw(CDC*/*pDC*/){

CDrawDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

if(!

pDoc)

return;

//TODO:

在此处为本机数据添加绘制代码

}

每次需要重绘窗口时(如程序启动、窗口大小改变、全部或部分窗口重现、程序员调用函数RedrawWindow或Invalidate/UpdateWindow),应用程序框架都会调用此CWnd消息响应成员函数(的覆盖)来绘制窗口客户区。

在Windows中,绘图一般在框架窗口的客户区(对应于视图类C*View)进行,使用的是封装在MFC的设备上下文(Device-Context,DC)类CDC中的各种绘图函数。

在绘图前,一般需先得到客户区大小和CDC对象、设置绘图颜色,然后再根据文档数据或用户操作来绘制各种图形。

8.1几何对象的结构和类

图8-2GDI几何对象的结构与类

为了使用绘图函数,应该先了解绘图所用到的几种表示几何对象的结构和类,包括点、大小和矩形,其中常用的是点和矩形。

这些结构和类被分别定义在头文件windef.h和afxwin.h中。

MFC中的几何对象类都是独立的类(不是CObject的派生类),是对API中对应结构的C++封装,参见图8-2。

8.1.1点

点(point)在API中的结构为POINT,对应的MFC类为CPoint。

1.点结构POINT

API中的点数据结构POINT用来表示一点的x、y坐标:

typedefstructtagPOINT{LONGx;LONGy;}POINT;

其中,类型LONG(32位整数)的定义为:

typedeflongLONG;

2.点类CPoint

MFC中的点类CPoint为一个没有基类的独立类,封装了POINT结构,有成员变量x和y,其构造函数有5种:

CPoint();//默认

CPoint(intinitX,intinitY);//常用

CPoint(POINTinitPt);

CPoint(SIZEinitSize);

CPoint(LPARAMdwPoint);//低字设为x、高字设为y

CPoint类还定义了4个平移和设置的成员函数:

voidOffset(intxOffset,intyOffset);

voidOffset(POINTpoint);

voidOffset(SIZEsize);

voidSetPoint(intX,intY);

另外,CPoint类还重载了+、-、+=、-=、==、!

=等运算符来支持CPoint对象和CPoint、POINT、SIZE对象之间的运算。

8.1.2大小

大小(size,尺寸)在API中的结构为SIZE,在MFC中的类为CSize。

1.大小结构SIZE

大小结构SIZE用来表示矩形的宽cx和高cy:

typedefstructtagSIZE{LONGcx;LONGcy;}SIZE;

2.大小类CSize

MFC中的大小类CSize也为一个没有基类的独立类,封装了SIZE结构,有成员变量cx和cy,其构造函数也有5种:

CSize();

CSize(intinitCX,intinitCY);

CSize(SIZEinitSize);

CSize(POINTinitPt);

CSize(DWORDdwSize);//低字设为cx、高字设为cy

CSizet类也重载了+、-、+=、-=、==、!

=等运算符来支持CSize对象和CSize、POINT、SIZE、RECT对象之间的运算。

8.1.3矩形

矩形(rectangle)在API中的结构为RECT,在MFC中的类为CRect。

1.矩形结构RECT

API中的矩形结构RECT定义了矩形的左上角与右下角的坐标:

typedefstructtagRECT{LONGleft;LONGtop;LONGright;LONGbottom;}RECT;

2.矩形类CRect

MFC中的矩形类CRect也为一个没有基类的独立类,封装了RECT结构,有成员变量left、top、right和bottom,其构造函数有6种:

CRect();//默认

CRect(intl,intt,intr,intb);//常用

CRect(constRECT&srcRect);

CRect(LPCRECTlpSrcRect);

CRect(POINTpoint,SIZEsize);

CRect(POINTtopLeft,POINTbottomRight);

CRect类重载了=,+、-,+=、-=,==、!

=,&、|,&=、|=等运算符来支持CRect对象和CRect、POINT、SIZE、RECT对象之间的运算。

还定义了转换符LPCRECT和LPRECT来自动完成CRect对象到矩形结构和类指针LPCRECT和LPRECT的转换。

CRect类中常用的属性和成员函数有:

intWidth()const;

intHeight()const;

CSizeSize()const;

CPoint&TopLeft();

CPoint&BottomRight();

CPointCenterPoint()const;

voidSwapLeftRight();

BOOLIsRectEmpty()const;

BOOLPtInRect(POINTpoint)const;

voidSetRect(intx1,inty1,intx2,inty2);

voidSetRect(POINTtopLeft,POINTbottomRight);

voidOffsetRect(intx,inty);

voidMoveToXY(intx,inty);

3.判断点是否在矩形中

有时需要判断某点(如鼠标位置)是否在某一矩形区域(如控件)中,这可以调用CRect类的PtInRect函数来做:

BOOLPtInRect(POINTpoint)const;

该函数当点point在其矩形区域内时,返回真。

注意,该矩形区域不包括矩形的右边界和底边界。

例如:

CRectrect(10,10,371,267);

voidCDrawView:

:

OnLButtonUp(UINTnFlags,CPointpoint)

{

//TODO:

在此添加消息处理程序代码和/或调用默认值

if(rect.PtInRect(point))......

CView:

:

OnLButtonUp(nFlags,point);

}

8.2客户区大小和DC

在绘图前,一般需先获得客户区大小和设备上下文DC。

8.2.1获得客户区大小

绘图一般都是在框架窗口的客户区(对应于视图类)进行,而客户区的大小在运行时可由用户动态改变,为了使绘制的图形能随窗口大小自动改变,需先得到当前客户区大小的数据(宽w和高h)。

获取客户区大小的方法有如下两种:

1.在消息响应函数OnSize中获得

可利用属性窗口的消息页,为视图类添加WM_SIZE消息的响应函数OnSize。

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

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

例如:

voidCDrawView:

:

OnSize(UINTnType,intcx,intcy){

CView:

:

OnSize(nType,cx,cy);

//TODO:

在此处添加消息处理程序代码

m_iW=cx;m_iH=cy;

}

其中,nType的值为:

●SIZE_MAXIMIZED(窗口已被最大化)

●SIZE_MINIMIZED(窗口已被最小化)

●SIZE_RESTORED(窗口已被改变大小)

●SIZE_MAXHIDE(其他窗口被最大化)

●SIZE_MAXSHOW(其他窗口从最大化还原)

2.调用成员函数GetClientRect得到

也可在绘图前,定义一个矩形结构变量rect,然后再调用CWnd类的成员函数GetClientRect来得到当前客户区矩形的数据,该函数的原型为:

voidGetClientRect(LPRECTlpRect)const;

其中,矩形结构的右(right)与底(bottom)就是客户区的宽与高(其左left与顶top都为0)。

例如:

RECTrect;

GetClientRect(&rect);

intw=rect.right,h=rect.bottom;

8.2.2DC

在Windows中,绘图使用的是封装在MFC的DC(Device-Context,设备上下文/绘图环境)类CDC中各种绘图函数。

1.CDC类

图8-3DC类

CDC是CObject的直接派生类,CDC类自己也有若干派生类,其中包括:

窗口客户区DC所对应的CClientDC类、OnPaint和OnDraw消息响应函数的输入参数中使用的CPaintDC类、图元文件对应的CMetaFileDC类和整个窗口所对应的CWindowDC类,参见图8-3。

在MFC绘图中,一般直接使用CDC类即可。

CDC类中有许多成员函数,可以用来设置各种绘图环境、属性和参数,以及绘制各种图形和图像等,将在后面陆续加以介绍。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 城乡园林规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1