GDI编程-绘图
更新时间:2023-10-26 17:20:01 阅读量: 综合文库 文档下载
火龙果?整理 uml.org.cn 第8章 GDI编程1-绘图
详细介绍了GDI绘图,希望对你有帮助:
GDI(Graphics Device Interface,图形设备接口)是Windows操作系统的传统图形子系统,负责与设备无关的图形绘制,Win32 API为应用程序提供了丰富的绘图函数和功能,MFC对它们进行了C++类封装,参见图8-1。
Windows应用程序 Win32 API 执行程序 设备驱动程序 用户界面(User) 内核(Kernel) 硬件抽象层(HAL) 计算机硬件 图8-1 GDI与Windows操作系统(其中彩色部分为操作系统)
传统GDI是随Windows 1.0于1985年11月推出的,新式GDI+则是随Windows XP于2001年10月推出的GDI的改进版,增加了α混色、渐变画刷、样条曲线、矩阵变换、图像处理、持久路径等新功能。随Windows Vista及.NET框架3.0微软于2006年11月又推出了基于DirectX和.NET框架的全新图形子系统WPF(Windows Presentation Foundation,视窗显示/展现基础),它统一了桌面和浏览器等客户端应用程序的图形界面,采用XAML声明式编程,将用户界面的设计和编程彻底分离开来,是Windows的下一代GUI显示系统。
本书从第8章到第11章,将详细讨论如何使用GDI进行传统的Windows图形编程,包括绘图、文字、图像、动画、图标、图元文件和打印等内容。GDI+是建立在GDI之上的,计划在第14和15章中作简单介绍。WPF则是以.NET框架为基础的,准备在第19上和20章中再加以讨论。
在MFC应用程序中,绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw中进行,例如:
void CDrawView::OnDraw(CDC* /*pDC*/) {
MFC GDI+ 图形子系统(GDI) 图形驱动程序 CDrawDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc)
return;
1
火龙果?整理 uml.org.cn }
// TODO: 在此处为本机数据添加绘制代码
每次需要重绘窗口时(如程序启动、窗口大小改变、全部或部分窗口重现、程序员调用函数RedrawWindow或Invalidate/UpdateWindow),应用程序框架都会调用此CWnd消息响应成员函数(的覆盖)来绘制窗口客户区。
在Windows中,绘图一般在框架窗口的客户区(对应于视图类C*View)进行,使用的是封装在MFC的设备上下文(Device-Context,DC)类CDC中的各种绘图函数。
在绘图前,一般需先得到客户区大小和CDC对象、设置绘图颜色,然后再根据文档数据或用户操作来绘制各种图形。
8.1 几何对象的结构和类
为了使用绘图函数,应该先了解绘图所用到的几种表示几何对象的结构和类,包括点、大小和矩形,其中常用的是点和矩形。这些结构和类被分别定义在头文件windef.h和afxwin.h
中。MFC中的几何对象类都是独立的类(不是CObject的派生类),是对API中对应结构的C++封装,参见图8-2。
图8-2 GDI几何对象
的结构与类
8.1.1 点
点(point)在API中的结构为POINT,对应的MFC类为CPoint。
1.点结构POINT
API中的点数据结构POINT用来表示一点的x、y坐标:
typedef struct tagPOINT { LONG x; LONG y; } POINT;
其中,类型LONG(32位整数)的定义为:typedef long LONG;
2.点类CPoint
MFC中的点类CPoint为一个没有基类的独立类,封装了POINT结构,有成员变量x和y,其构造函数有5种:
2
火龙果?整理 uml.org.cn CPoint( ); // 默认
CPoint( int initX, int initY ); // 常用 CPoint( POINT initPt );
CPoint( SIZE initSize );
CPoint( LPARAM dwPoint ); // 低字设
为x、高字设为y
CPoint类还定义了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对象之间的运算。
8.1.2 大小
大小(size,尺寸)在API中的结构为SIZE,在MFC中的类为CSize。
1.大小结构SIZE
大小结构SIZE用来表示矩形的宽cx和高cy:
typedef struct tagSIZE { LONG cx; LONG cy; } SIZE;
2.大小类CSize
MFC中的大小类CSize也为一个没有基类的独立类,封装了SIZE结构,有成员变量cx和cy,其构造函数也有5种:
CSize( );
CSize( int initCX, int initCY ); CSize( SIZE initSize );
CSize( POINT initPt );
CSize( DWORD dwSize ); // 低字设为
cx、高字设为cy
CSizet类也重载了+、-、+=、-=、==、!= 等运算符来支持CSize对象和CSize、POINT、SIZE、RECT对象之间的运算。
8.1.3 矩形
矩形(rectangle)在API中的结构为RECT,在MFC中的类为CRect。
3
火龙果?整理 uml.org.cn 1.矩形结构RECT
API中的矩形结构RECT定义了矩形的左上角与右下角的坐标:
typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom;} RECT;
2.矩形类CRect
MFC中的矩形类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对象之间的运算。还定义了转换符LPCRECT和LPRECT来自动完成CRect对象到矩形结构和类指针LPCRECT和LPRECT的转换。
CRect类中常用的属性和成员函数有: int Width( ) const; int Height( ) const; CSize Size( ) const; CPoint& TopLeft( ); CPoint& BottomRight( ); CPoint CenterPoint( ) const; void SwapLeftRight(); 3.判断点是否在矩形中
BOOL IsRectEmpty( ) const;
BOOL PtInRect( POINT point ) const; void SetRect( int x1, int y1, int x2, int y2 ); void SetRect(POINT topLeft, POINT
bottomRight);
void OffsetRect(int x, int y); void MoveToXY(int x, int y);
有时需要判断某点(如鼠标位置)是否在某一矩形区域(如控件)中,这可以调用CRect类的PtInRect函数来做:
BOOL PtInRect( POINT point ) const;
该函数当点point在其矩形区域内时,返回真。注意,该矩形区域不包括矩形的右边界和底边界。例如:
CRect rect( 10, 10, 371, 267 );
4
火龙果?整理 uml.org.cn void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) { }
// TODO: 在此添加消息处理程序代码和/或调用默认值 if ( rect.PtInRect( point ) ) ... ... CView::OnLButtonUp(nFlags, point);
8.1.4 获得客户区大小
绘图一般都是在框架窗口的客户区(对应于视图类)进行,而客户区的大小在运行时可由用户动态改变,为了使绘制的图形能随窗口大小而自动改变,需先得到当前客户区大小的数据(宽和高)。
获取客户区大小的方法有如下两种:
1.OnSize
获取客户区大小的第一种方法是通过消息响应函数OnSize中获得。
可利用属性窗口的消息页,为视图类添加WM_SIZE消息的响应函数OnSize。该函数会在窗口第一次显示或窗口大小被改变时被系统调用。其输入参数中的cx和cy就是当前客户区的宽和高,可将它们赋值给类变量(如m_iW和m_iH)供绘图时使用。例如:
void CDrawView::OnSize(UINT nType, int cx, int cy) { }
其中,nType的值为:
? SIZE_MAXIMIZED(窗口已被最大化) ? SIZE_MINIMIZED(窗口已被最小化) ? SIZE_RESTORED(窗口已被改变大小) ? SIZE_MAXHIDE(其他窗口被最大化) ? SIZE_MAXSHOW(其他窗口从最大化还原)
CView::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 m_iW = cx; m_iH = cy;
5
正在阅读:
GDI编程-绘图10-26
2012年11月(劳动部)助理物流师真题(含答案)05-12
(穗人社发〔2012〕9号)关于印发《申报评审、认定专业技术资格学历资历条件指引》的通知03-13
岩溶土壤的生态地球化学特征及其指示意义08-12
建筑工程测量期末考试试题(含答案)avl05-27
产业结构优化升级对策与建议12-12
盈余管理10-02
ICC workshop学习笔记06-03
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 绘图
- 编程
- GDI
- 《北京的春节》练习(附答案) -
- 连锁超市公司网站建设方案
- SIEMENS802D数控车床操作
- 护理管理与质量持续 改进 - 图文
- VC和CDB调试研究(OPNET和VC联调)
- 环境卫生笔记
- 2018年全国高校辅导员素质能力大赛基础知识试题+参考答案
- 第一节 职业生活中的道德与法律
- 蜉蝣
- 第六章 社会主义本质和建设中国特色社会主义总任务习题与答案
- 工程力学教程篇(第二版)习题第15章答案
- 慕课书法鉴赏习题答案
- 宜兴房地产市场分析
- 《海水为什么是蓝的》教案
- 移出经营异常名录所需证明材料
- 北邮计科大三下数据库实验3
- 公司员工工资定级管理制度 4.16
- 浅析T+T英语教学1
- 省级现代农业示范区申报书
- 如何使用PB840呼吸机