《第4章vc++图形处理》由会员分享,可在线阅读,更多相关《第4章vc++图形处理(38页珍藏版)》请在金锄头文库上搜索。
1、1 VC 的图形处理 Windows图形设备接口窗口内绘图使用绘图属性与绘图有关的两个消息 2 1Windows图形设备接口 GDI 3 1 1GDI的基本概念 GDI是与设备无关的图形设备接口就是操作系统屏蔽了硬件设备的差异用户编程时无需考虑特殊的硬件设置提供了函数实现在输出设备上显示图形或文字 提供了绘图对象 设备描述表画刷 画笔字体位图调色板 4 设备描述表 设备 显示器 打印机等 环境的属性的集合应用程序通过设备描述表的句柄 建立与设备的联系 实现图形操作 MFC设备描述表类MFC封装了Windows提供的不同类型的设备描述表于不同的DC类基类CDC 定义了设备描述表对象 并且提供在显
2、示器 打印机或Windows用户区上绘图的方法 封装了GDI函数CPaintDC CDC的子类 仅在WM PAINT消息需要响应时才起作用CClientDC CDC的子类 与CClientDC对象相关的设备环境是窗口的客户区CWindowDC CDC的子类 与该对象相关的设备环境是整个窗口 包括客户区和非客户区 还可访问整个屏幕 1 2设备描述表 5 2窗口内绘图 画直线函数BOOLCDC LineTo intX intY 从当前位置向指定坐标点画直线的函数X和Y为线段的终点坐标CPointCDC MoveTo intX intY 设置画笔当前位置X Y为新位置的坐标 6 例 画直线pDC M
3、oveTo 10 10 pDC LineTo 100 100 画折线函数BOOLPolyline LPPOINTlpPoints intnCount lpPoints是指向折线顶点数组的指针nCount指定折线顶点数组中顶点数目 7 绘制弧线BOOLArc intX1 intY1 intX2 intY2 intX3 intY3 intX4 intY4 X1 Y1为边框矩形左上角的逻辑坐标X2 Y2边框矩形右下角的逻辑坐标X3 Y3弧的起点坐标X4 Y4弧的终点坐标 8 绘制弧线BOOLArc LPCRECTlpRect POINTptStart POINTptEnd lpRect为边框矩形 可
4、以是LPCRECT或CRect对象ptStart弧的起点ptEnd弧的终点 9 BOOLPie intX1 intY1 intX2 intY2 intX3 intY3 intX4 intY4 BOOLPie LPCRECTlpRect POINTptStart POINTptEnd 绘制饼图 并用当前画刷填充 10 BOOLRectangle intX1 intY1 intX2 intY2 BOOLRectangle LPCRECTlpRect X1 Y1 和 X2 Y2 分别为矩形的左上角和右下角的逻辑坐标lpRect为一个矩形结构的指针 绘制矩形 并用当前画刷填充 11 BOOLEllip
5、se intX1 intY1 intX2 intY2 BOOLEllipse LPCRECTlpRect BOOLPolygon LPPOINTlpPoints intnCount 包含各点坐标的POINT数组的地址 多边形点的个数 绘制椭圆 并用当前画刷填充 绘制多边形 并用当前画刷填充 12 绘图实例 使用前面介绍的绘图函数在屏幕上画直线 矩形等步骤用向导AppWizard生成单文档工程TestGraph编辑视图类CTestGraphView中的OnDraw函数 实现画图功能 代码如下 VoidCTestGraphView OnDraw CDC pDC CTestGraphDoc pDoc
6、 GetDocument ASSERT VALID pDoc pDC MoveTo 20 90 pDC LineTo 120 90 13 POINTpolyline 70 240 20 190 70 190 20 240 pDC Polyline polyline sizeof polyline sizeof POINT pDC Rectangle 210 300 310 360 pDC Ellipse 210 200 310 260 运行程序注意绘图坐标轴方向缺省值 14 3使用绘图属性 15 3 1画笔 画笔的操作创建画笔将画笔选入设备环境恢复原有画笔画笔的创建用类CPen的CreateP
7、en方法 16 PS DASH 虚线 宽度 1 PS DASHDOT 点划线 宽度 1 PS DASHDOTDOT 双点划线 宽度 1 PS DOT 点线 宽度 1 PS INSIDEFRAME 实线PS NULL 无PS SOLID 实线 BOOLCreatePen intnPenStyle 确定画笔样式intnWidth 画笔宽度COLORREFrgbColor 画笔颜色 17 创建画笔后 必须调用SelectObject函数将其选入设备环境 pOldPen pDC SelectObject 18 Windows使用宏RGB定义绘图的颜色 其形式为 RGB nRed nGreen nBlu
8、e 红色 RGB 255 0 0 蓝色 RGB 0 0 255 绿色 RGB 0 255 0 颜色的设置 19 画笔实例 VoidCPenTestView OnDraw CDC pDC CTestGraphDoc pDoc GetDocument ASSERT VALID pDoc CPenpNewPen pOldPen if pNewPen CreatePen PS DASH 1 RGB 0 0 0 pOldPen pDC SelectObject 20 else AfxMessageBox 不能创建笔 return CPenpNewPen2 if pNewPen2 CreatePen PS
9、 SOLID 10 RGB 0 0 0 pOldPen pDC SelectObject 21 CPenpNewPen3 if pNewPen3 CreatePen PS SOLID 5 RGB 255 0 0 pOldPen pDC SelectObject 22 3 2使用画刷 CBrush类 画刷的操作 包括 创建 选入设备环境和删除画刷的创建步骤生成一种画刷CBrush 无参数的构造函数构造了一个未初始化的CBrush对象 使用它之前必须对它进行初始化 带参数的构造函数则不用 2 CBrush CBitmap pBitmap pBitmap 指向用作刷子的位图对象指针 23 3 CBr
10、ush COLORREFcrColor crColor 制定刷子颜色 4 CBrush intnIndex COLORREFcrColor nIndex 指定画刷风格 24 HS BDIAGONAL45度从左上到右下HS DIAGCROSS45度叉线HS FDIAGONAL45度从左下到右上HS CROSS垂直相交的阴影线HS HORIZONTAL水平阴影线HS VERTICAL垂直阴影线 调用CBrush对象的函数初始化刷子 1 创建具有指定颜色的单色画刷CreateSolidBrush COLORREFrgbColor 2 创建指定阴影图案和颜色的画刷CreateHatchBrush in
11、tnHctchStyle COLORREFrgbColor 25 将画刷选入设备环境pOldBrush pDC SelectObject 26 画刷应用实例 1利用向导生成工程BrushTest 2 编辑视图类的OnDraw 函数 设置各种画刷 27 VoidCBrushTestView OnDraw CDC pDC CBrushTestDoc pDoc GetDocument ASSERT VALID pDoc inti CBrush pNewBrush pOldBrush pNewBrush newCBrush if pNewBrush CreateSolidBrush RGB 255 0
12、 0 pOldBrush pDC SelectObject pNewBrush pDC Rectangle 40 20 200 50 pDC SelectObject pOldBrush deletepNewBrush 28 pNewBrush newCBrush if pNewBrush CreateHatchBrush HS BDIAGONAL RGB 200 0 0 pOldBrush pDC SelectObject pNewBrush pDC Ellipse 260 20 420 50 pDC SelectObject pOldBrush deletepNewBrush 29 CBi
13、tmapPBitmap pNewBrush newCBrush PBitmap LoadBitmap IDB BITMAP1 pNewBrush CreatePatternBrush 30 3 3映像模式 映像模式定义了将逻辑单位转化为设备的度量单位 以及x和y方向 窗口 对应逻辑坐标系上所设定的区域 视口 对应实际输出设备上所设定的区域 31 坐标系统逻辑坐标系统设备坐标系统 以象素点为单位屏幕 整个屏幕坐标区为坐标系统窗口 应用程序的窗口为坐标区 含边界 用户区 窗口中的工作区为坐标系统 32 缺省的映射模式 将窗口中的对称图形映射到视口时仍为对称图形 按照窗口和视口的坐标比例进行映射 3
14、3 映像模式的设置根据需要设置映像模式Pdc SetMapMode MM TEXT 34 视口和窗口的原点坐标缺省值均为 0 0 可调用函数SetWindowOrgEx设定窗口原点 可调用函数SetViewportOrgEx设定视口原点 只有在映射模式为MM ANISOTROPIC和MM ISOTROPIC时才有意义 35 坐标系使用原则 大多数CDC成员函数如绘图函数以逻辑坐标为参数CWnd的成员函数以设备坐标为参数从鼠标消息如WM LBUTTONDOWN获得的鼠标位置都是设备坐标坐标转换函数 LPToDP 逻辑坐标 设备坐标DPToLP 设备坐标 逻辑坐标 36 3 4 图形刷新 出现如下
15、情况时 系统发送WM PAINT消息 窗口大小的调整 窗口移动 被覆盖后的恢复 应用程序收到该消息时要调用OnPaint 完成窗口的重绘 37 有时 没有上述窗口的大小改变也需要重绘窗口 如用户希望窗口中的数据添加一些内容 这时需要调用CWnd的成员函数 1 voidInvalidate BOOLbErase TRUE 作用 使整个客户区无效 由此引发WM PAINT消息bErase TRUE时更新区的背景被擦除 否则 更新区的背景保持不变 2 voidInvalidateRect LPCRECTlpRect BOOLbErase TRUE 作用 使客户区一个矩形区域无效 由此引发WM PAINT消息 38 WM PAINT消息的级别非常低 窗口可能先收到其它消息 此时 为提高WM PAINT消息的优先级 调用CWnd UpdateWindow 函数 例如程序中调用了Invalidate函数请求窗口重绘 而且还希望立即在刷新了的窗口中输出内容 这时需要强行得到一个绘图消息 代码如下 InvalidateRect rect TRUE UpdateWindow