1、图形基础 GDI与绘图 主要内容 GDI功能与设备无关性设备环境绘图基本步骤绘图函数绘图模式示例思考 循环绘图 GDI与设备无关性 图形设备接口 GraphicsDeviceInterface GDI GDI是Windows系统的重要组成部分 是为设备无关的图形设计的 负责控制在输出设备上显示图形或文字 设备无关性 我们在程序中使用的图形数据不用考虑具体设备 用一种通用的标准格式就行 显示或打印的时候由GDI内核及设备驱动程序转换为相应的设备数据 设备环境 设备环境 DeviceContext DC 又称为设备上下文 或者设备描述表为什么要使用DC Windows程序在屏幕 打印机或其它设备上
2、画图时 它并不是将像素直接输出到设备上 而是将图绘制到由设备描述表表示的逻辑意义上的 显示设备空间 上 通过设备描述表 完成应用程序和物理设备之间的交互 从而实现了应用程序设计的设备无关性 DC是Windows应用程序 设备驱动程序和输出设备之间的桥梁 所有的绘制操作都通过设备描述表进行 设备环境 DC的种类 屏幕设备环境 内存设备环境打印机设备环境 信息设备环境DC的结构 它是Windows中定义的一种数据结构 它包括了与一个设备 如显示器和打印机 的绘制属性相关的信息描述 例如 设备上可使用的输出区域 逻辑坐标系 所选定的绘图工具 绘图前景色 填充色 字体 字体颜色 字的磅数等属性 设备环
3、境的使用 设备环境的使用途径 设备环境句柄DC虽然是一个Windows中的结构 但在应用程序中永远都不能直接存取DC 不过 由于DC也是GDI管理的一个对象 因此应用程序可以使用DC的句柄来间接地存取设备环境及其属性 设备环境句柄的主要操作 获取设备环境句柄释放设备环境句柄 设备环境句柄操作 响应WM PAINT消息时 hdc BeginPaint hwnd 窗口客户区绘图的一般步骤 绘图示例1 caseWM PAINT 获取设备环境句柄hdc BeginPaint hwnd return0 绘图示例2 caseWM LBUTTONDOWN 获取设备环境句柄hdc GetDC hwnd 获取绘
4、图工具hpen HPEN GetStockObject BLACK PEN 选择绘图工具SelectObject hdc hpen 利用选择的绘图工具绘图Ellipse hdc 100 100 300 300 释放设备环境句柄ReleaseDC hwnd hdc return0 GDI基本图形 非填充式 点 直线 曲线 弧线 贝塞尔曲线等 填充式 矩形 椭圆 饼图 扇形 弓形位图文本 点 直线绘制函数 画点 像素 SetPixel hdc x y crColor crColor GetPixel hdc x y 画直线MoveToEx hdc xBeg yBeg NULL LineTo hdc
5、 xEnd yEnd Polyline hdc pt n 曲线及多边形绘制函数 填充式绘制函数 Rectangle画矩形 Ellipse画椭圆 RoundRect画带圆角的矩形 Pie画椭圆的一部分 使其看起来像一个扇形 Chord画椭圆的一部分 以呈弓形 绘图工具的使用 画笔 取得画笔取得库存画笔hpen HPEN GetStockObject WHITE PEN 自定义画笔hpen CreatePen PS SOLID 3 RGB 255 0 0 选入设备环境SelectObject hdc hpen 绘图工具的使用 画刷 取得画刷取得库存画刷hbrush HBRUSH GetStockO
6、bject GRAY BRUSH 自定义画刷hbrush CreateSolidBrush RGB 255 0 0 选入设备环境SelectObject hdc hbrush 多边形填充方式 ALTERNATEWINDING实例 五角星 Polygon FillMode 有趣的难题 图形缩放 解决方案1 利用窗口客户区尺寸实例1autosize client解决方案2 利用图形映射方式实例2autosize mapmode 坐标映射实质 GDI将应用程序的逻辑坐标系映射到设备坐标系 用一个逻辑单位代表一个实际物理尺寸 常用API SetMapModeSetWindowExtExSetWindo
7、wOrgExSetViewportExtExSetViewportOrgEx 映射方式 绘图实例 实例1动态椭圆 实例2正弦曲线 实例3动态正弦曲线 实例4随机画矩形 API汇总 RectangleSetRectFrameRectFillRectInflateRectOffsetRectDrawFocusRectDrawEdgeRoundRect EllipsePieArcChordMoveToExLineToSetPixelGetPixelPolyline CreatePenCreateSolidBrushCreateHatchBrushInvalidateRectGetMessagePeekMessageSleepDrawIconPolyBezier