首页计算机计算机软件VisualC++ 02 第2章 Windows图形绘制.pptx

02 第2章 Windows图形绘制.pptx

页数:55页文件大小:309.0 KB来源: VisualC++ppt课件

本课件对应课程第2章Windows图形绘制,先介绍图形设备接口GDI与设备描述表的作用,说明图形刷新的请求、响应与三种有效刷新方法,随后讲解用BeginPaint与GetDC获取设备环境的方式、映像模式的设置与坐标系统,再系统给出颜色、画笔、画刷等绘图工具的创建与释放流程,最后配合常用绘图函数与两个应用实例完成图形输出。

第2章Windows图形绘制教学重点页,聚焦图形设备接口、设备描述表、图形刷新与映像模式等概念
GDI图形设备接口说明页,指出GDI负责系统与绘图程序间信息交换并实现图形的设备无关性
设备描述表说明页,说明它是设备环境属性的集合,可看作图形输出模板并由句柄间接访问
查看本课件的文字版(共 55 页,供检索与复制)

第1页:第2章教学重点

  • 教学重点1
  • 图形输出基本概念图形设备接口
  • 设备描述表
  • 图形刷新
  • 映像模式2
  • 图形输出基本操作获取设备环境
  • 绘图工具(画笔
  • 画刷)
  • 映像模式设置
  • 颜色设置(RGB宏)
  • 绘图函数

第2页:2.1 图形设备接口

2.1图形设备接口GDI
Graphics Device Interface图形设备接口=>

图形的设备无关性GDI是Windows系统的重要组成部分,负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上显示图形或文字。

第3页:设备描述表

2.1图形设备接口---设备描述表设备描述表=》定义绘图规则设备描述表即为设备环境的属性的集合。 可以将设备描述表看成图形的“输出模板”。 应用程序通过设备描述表的句柄来间接地访问设备描述表及其属性,应用程序每一次图形操作均参照设备描述表中的属性执行。

第4页:图形刷新

  • 2.1图形设备接口---图形刷新图形刷新是绘图过程中必须考虑的重要问题,包括:刷新请求
  • 对刷新请求的响应
  • 刷新方法

刷新请求当用户区的内容需要刷新时,系统向应用程序消息队列发送WM_PAINT消息。

第5页:窗口移动后的刷新

2.1图形设备接口---图形刷新系统对刷新请求的响应窗口移动后的刷新

  • 用户区移动或显示;
  • 用户窗口大小改变;
  • 程序通过滚动条滚动窗口;

上述事件发生时,系统向应用程序发送WM_PAINT消息。

第6页:被覆盖区域的刷新

2.1图形设备接口---图形刷新系统对刷新请求的响应被覆盖区域的刷新

  • 下拉式菜单关闭,需要恢复被覆盖的部分;
  • 清除消息框或对话框需要恢复被覆盖的部分;

上述事件发生时,系统试图保存被覆盖的区域,以备以后刷新。 此后如果系统不能有效刷新,则向应用程序发送WM_PAINT消息。

第7页:对象穿越后的刷新

2.1图形设备接口---图形刷新系统对刷新请求的响应对象穿越后的刷新

  • 光标穿过用户区(2)图标拖过用户区上述事件发生时,系统自动完成刷新任务,应用程序不必考虑。

第8页:有效的刷新方法

2.1图形设备接口---图形刷新有效的刷新方法保存副本:在内存中保持一个显示输出的副本,刷新时将副本拷贝到相应的窗口中;

记录事件
刷新时重新执行这个曾经发生的事件;
重新绘制
将图形绘制处理程序放在消息WM_PAINT响应模块中,刷新时重绘图形。

第9页:BeginPaint函数

2.1图形设备接口---获取设备环境获取设备环境是应用程序输出图形的先决条件,方法是调用函数BeginPaint或GetDC。 调用BeginPaint函数应用程序响应WM_PAINT消息进行图形刷新时,主要通过调用BeginPaint函数获取设备环境。

HDC BeginPaint(HWND hwnd,LPPAINTSTRUCT lpPaint);

第10页:EndPaint函数

2.1图形设备接口---获取设备环境由BeginPaint函数获取的设备环境要用EndPaint函数释放。

BOOL EndPaint(HWND hWnd,CONST PAINTSTRUCT *lpPaint);

第11页:无效区域

2.1图形设备接口---获取设备环境窗口被另一个窗口覆盖的区域称为无效区域。 Windows系统为每个窗口建立了一个PAINTSTRUCT结构,该结构中包含了包围无效区域的一个最小矩形的结构RECT,应用程序可以根据这个无效矩形执行刷新操作。

第12页:PAINTSTRUCT结构体

2.1图形设备接口---获取设备环境

typedef struct tagPAINTSTRUCT{ HDC hdc;//表示擦除无效矩形的背景RECT rcPaint;PAINTSTRUCT;

第13页:BeginPaint调用示例

2.1图形设备接口---获取设备环境程序举例:HDC hdc; PAINTSTRUCT ps;

case WM_PAINT:hdc = BeginPaint(hwnd, &ps); …break;

第14页:GetDC函数

2.1图形设备接口---获取设备环境调用GetDC函数如果绘图工作并非由WM_PAINT消息驱动,则调用GetDC函数获取设备环境。

HDC GetDC( HWND hWnd);

第15页:ReleaseDC函数

2.1图形设备接口---获取设备环境调用GetDC函数由GetDC函数获取的设备环境必须用ReleaseDC函数释放。

int ReleaseDC(HWND hWnd, 

第16页:GetDC调用示例

2.1图形设备接口---获取设备环境程序举例:HDC hdc;

case WM_LBUTTONDOWN:hdc = GetDC(hwnd); …break;

第17页:映像模式

2.1图形设备接口---映像模式映像模式定义了将逻辑单位转化为设备的度量单位以及设备的x方向和y方向。

窗口
对应逻辑坐标系上程序员设定的区域。
视口
对应实际输出设备上程序员设定的区域。
坐标系统
逻辑坐标系统;
  • 设备坐标系统(屏幕坐标系统
  • 窗口坐标系统
  • 用户区坐标系统)

第18页:映像模式对照表

映像模式对照表

Windows映像模式与逻辑单位映射对照表
映像模式一个逻辑单位映射为坐标系设定
MM_ANISOTROPIC系统确定(Optional)系统确定
MM_HIENGLISH0.001英寸Y上,X右
MM_HIMETRIC0.01毫米Y上,X右
MM_ISOTROPIC系统确定,x轴与y轴单位比例1:1系统确定
MM_LOENGLISH0.01英寸Y上,X右
MM_LOMETRIC0.1毫米Y上,X右
MM_TEXT一个像素Y下,X右
MM_TWIPS1/1440英寸Y上,X右

2.1图形设备接口---映像模式坐标系设定将一个逻辑单位映射为映像模式Optional系统确定MM_ANISOTROPICY上,X右0.001英寸MM_HIENGLISHY上,X右0.01毫米MM_HIMETRICOptional,但x轴和y轴的单位此例为1: 1系统确定MM_ISOTROPICY上,X右0.01英寸MM_LOENGLISHY上,X右0.1毫米MM_LOMETRICY下,X右一个像素MM_TEXTY上,X右1/1440英寸MM_TWIPS

原文该表文字与数值错位粘连,表中「一个逻辑单位映射为」「坐标系设定」两列已按Windows映像模式标准值校正排列。

第19页:SetMapMode函数

2.1图形设备接口---映像模式应用程序可获取设备环境的当前映像模式,并根据需要设置映像模式。

(1)设置设备环境的映像模式(激光打印机分辨率300dpi)int SetMapMode(HDC hdc, 

第20页:SetMapMode调用示例

2.1图形设备接口---映像模式程序举例:HDC hdc; PAINTSTRUCT ps;

case WM_PAINT:hdc = BeginPaint(hwnd, &ps); SetMapMode(hdc, MM_LOMETRIC); …break;

第21页:GetMapMode函数

2.1图形设备接口---映像模式(2)获取当前设备环境的映像模式int GetMapMode(HDC hdc 

第22页:颜色与RGB宏

2.2绘图工具与颜色---颜色Windows使用RGB宏定义绘图的颜色

COLORREF RGB(BYTE bRed,BYTE bGreen,BYTE bBlue);

第23页:画笔的创建

2.2绘图工具与颜色---画笔画笔的操作:创建画笔; 将画笔选入设备环境; 删除画笔。

  • 画笔的创建使用画笔之前必须事先定义一个画笔句柄。

HPEN hPen;

第24页:系统预定义画笔

2.2绘图工具与颜色---画笔(i)使用Windows系统预定义的画笔。

BLACK_PEN, WHITE_PEN, NULL_PENHGDIOBJ GetStockObject(int fnObject 

第25页:获取画笔示例

2.2绘图工具与颜色---画笔例如,获取画笔BLACK_PEN的形式如下:HPEN hPen;

hPen = (HPEN)GetStockObject(BLACK_PEN); SelectObject(hdc,hPen);

第26页:CreatePen函数

2.2绘图工具与颜色---画笔(ii)创建自定义画笔,形式如下:HPEN CreatePen(int fnPenStyle,可选的画笔样式有,PS_SOLID、PS_DASH、PS_DOT、PS_DASHDOT、PS_DASHDOTDOT、PS_NULL、PS_INSIDEFRAME。

第27页:SelectObject函数

2.2绘图工具与颜色---画笔(2)创建画笔后,必须调用SelectObject函数将其选入设备环境。

HGDIOBJ SelectObject(HDC hdc,HGDIOBJ hgdiobj);

第28页:DeleteObject函数

2.2绘图工具与颜色---画笔(3)不再使用当前画笔时,需删除画笔,以免占内存。

BOOL DeleteObject(HGDIOBJ hObject);

第29页:画笔应用示例

2.2绘图工具与颜色---画笔程序举例:HPEN hPen;

hPen=CreatePen(PS_SOLID, 4, RGB(255, 0, 0)); SelectObject(hdc,hPen); …DeleteObject(hPen);

第30页:画刷的创建

  • 2.2绘图工具与颜色---画刷3
  • 画刷画刷的使用与画笔很相似,操作画刷也包括创建
  • 选入设备环境和删除
  • 画刷的创建使用画刷需事先定义一个画刷句柄。

HBRUSH hBrush;

第31页:系统预定义画刷

系统预定义画刷

Windows系统预定义画刷对照表
画刷标识说明
BLACK_BRUSH黑色画刷
DKGRAY_BRUSH深灰色画刷
GRAY_BRUSH灰色画刷
LTGRAY_BRUSH亮灰色画刷
NULL_BRUSH空画刷
WHITE_BRUSH白色画刷

2.2绘图工具与颜色---画刷(i)使用Windows系统预定义画刷。调用函数GetStockObject获取Windows系统提供的画刷。BLACK_BRUSH黑色画刷DKGRAY_BRUSH深灰色画刷GRAY_BRUSH灰色画刷LTGRAY_BRUSH亮灰色画刷NULL_BRUSH空画刷WHITE_BRUSH白色画刷

第32页:获取画刷示例

2.2绘图工具与颜色---画刷程序举例:HBRUSH hBrush;

hBrush = (HBRUSH)GetStockObject(GRAY_BRUSH); SelectObject(hdc,hBrush);

第33页:创建自定义画刷

2.2绘图工具与颜色---画刷(ii)创建自定义画刷。

HBRUSH CreateSolidBrush(COLORREF crColor); HBRUSH CreateHatchBrush(int fnStyle, 

第34页:画刷阴影样式

画刷阴影样式

画刷阴影样式对照表
阴影样式标识说明
HS_BDIAGONAL45度从左上到右下
HS_DIAGCROSS45度叉线
HS_FDIAGONAL45度从左下到右上
HS_CROSS垂直相交的阴影线
HS_HORIZONTAL水平阴影线
HS_VERTICAL垂直阴影线

2.2绘图工具与颜色---画刷画刷阴影样式HS_BDIAGONAL 45度从左上到右下HS_DIAGCROSS 45度叉线HS_FDIAGONAL 45度从左下到右上HS_CROSS垂直相交的阴影线HS_HORIZONTAL水平阴影线HS_VERTICAL垂直阴影线

第35页:画刷的选入与删除

2.2绘图工具与颜色---画刷

  • 选入设备环境。

创建画刷后,通过SelectObject将其选入设备环境。

  • 删除画刷。

不使用画刷时,可用DeleteObject删除画刷,释放内存。

第36页:画刷应用示例

2.2绘图工具与颜色---画刷程序举例:HBRUSH hBrush;

hBrush = CreateHatchBrush(HS_DIAGCROSS,(RBG(255,0,0)); SelectObject(hdc,hBrush); …DeleteObject(hBrush);

第37页:MoveToEx函数

2.3常用绘图函数1、设置画笔当前位置的函数

BOOL MoveToEx(HDC hdc, 

第38页:LineTo函数

2.3常用绘图函数2、从当前位置向指定坐标点画直线的函数

BOOL LineTo(HDC hdc,int nXEnd,int nYEnd); 程序举例:MoveToEx(hdc, 50, 50, NULL); LineTo(hdc, 100, 50);

第39页:Polyline函数

2.3常用绘图函数3、多段线

BOOL Polyline(HDC hdc,CONST POINT *lppt,int cPoints);

第40页:Polyline调用示例

2.3常用绘图函数程序举例:POINT pt[] = { { 100,10} ,{ 10,180} ,{ 200,180} } ; Polyline(hdc, pt, 3);

第41页:Arc函数(一)

2.3常用绘图函数4、绘制椭圆弧线的函数BOOL Arc(HDC hdc,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,

第42页:Arc函数(二)

2.3常用绘图函数4、绘制椭圆弧线的函数int nXStartArc,int nYStartArc,int nXEndArc,int nYEndArc);

第43页:Arc调用示例

2.3常用绘图函数程序举例

Arc(hdc,10,10,210,110,150,40,100,30);

本页源文件仅提取到标题或少量文字,详细内容请对照本页图示。

第44页:Pie函数(一)

2.3常用绘图函数5、绘制饼图,并用当前画刷进行填充BOOLPie(HDC hdc,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,

第45页:Pie函数(二)

2.3常用绘图函数5、绘制饼图,并用当前画刷进行填充int nXRadial1,int nYRadial1,int nXRadial2,int nYRadial2);

第46页:Pie调用示例

2.3常用绘图函数程序举例

Pie(hdc,10,10,210,110,150,40,100,30);

本页源文件仅提取到标题或少量文字,详细内容请对照本页图示。

第47页:Rectangle函数

2.3常用绘图函数6、绘制矩形,并用当前画刷进行填充

BOOL Rectangle(HDC hdc,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect ); 程序举例:Rectangle(hdc,10,10,210,110);

第48页:RoundRect函数

2.3常用绘图函数7、绘制圆角矩形,并用当前画刷填充

BOOL RoundRect(HDC hdc,int nLeftRect, int nTopRect,int nRightRect, int nBottomRect,int nWidth, int nHeight); 程序举例:RoundRect(hdc,10,10,210,110,30,20);

第49页:Ellipse函数

2.3常用绘图函数8、绘制椭圆,并用当前画刷填充

BOOL Ellipse(HDC hdc,int nLeftRect, int nTopRect,int nRightRect, int nBottomRect); 程序举例:Ellipse(hdc,10,10,210,110);

第50页:Polygon函数

2.3常用绘图函数9、绘制多边形,并用当前画刷填充

BOOL Polygon(HDC hdc,CONST POINT *lpPoints,int nCount);

第51页:Polygon调用示例

2.3常用绘图函数程序举例:POINT pt[] = { { 100,10} ,{ 10,180} ,{ 200,180} } ; Polygon(hdc, pt, 3);

第52页:例2-1图形填充

2.4应用实例---图形填充【例2-1】利用绘图函数创建填充区。 共有三个填充图形,第一个是用深灰色画刷填充带圆角的矩形,第二个是采用亮灰色画刷填充一个椭圆型图,第三个是用虚画刷填充饼形图。

第53页:例2-1运行效果

2.4应用实例---图形填充

本页源文件仅提取到标题或少量文字,详细内容请对照本页图示。

第54页:例2-2映像模式

2.4绘图函数演示---映射模式【例2-2】设置映像与使用映像模式实例。 程序运行时,初始阶段按缺省映像模式绘图。 用户通过单击鼠标以改变映像模式。 单击鼠标左键时通知应用程序将映像模式设置为MM_HIMETRIC,单击鼠标右键时通知应用程序将映像模式设置为MM_LOMETRIC,同时调用InvalidateRect函数刷新用户区。

第55页:例2-2运行效果

2.4绘图函数演示---映射模式

本页源文件仅提取到标题或少量文字,详细内容请对照本页图示。