第8章绘图、字体和位图 81概述 82简单图形的绘制 83字体与文字处理 84位图、图标与光标
第8章 绘图、字体和位图 8.1 概述 8.2 简单图形的绘制 8.3 字体与文字处理 8.4 位图、图标与光标
81概述 81.1设备环境类 (1) CPaintDC CPaintDc类的构造函数会自动调用 BeginPaint,而它的析构函数则会自动调用 EndPaint (2) CClientDC FICWindowDC CWindowDO和 CClientDo构造函数分别调用 Get WindowDC和 GetO,但它们的析构函数 都是调用 ReleaseD函数。 (3) CMetaFileDC CMetaFileDC封装了在一个 Windows图元文件中绘图的方法。 81.1坐标映射 为了能保证打印的结果不受设备的影响, Windows定义了一些映射模式,这些映射模式决 定了设备坐标和逻辑坐标之间的关系。它们是: MM TEXT 每个逻辑单位等于一个设备像素,x向右为正,y向下为正 MM HIENGLISH 每个逻辑单位为0.001英寸,x向右为正,y向上为正 MM HIMETRIC 每个逻辑单位为001毫米,x向右为正,y向上为正 MM ANISOTROPIC x,y可变比例 MM ISOTROPIC x,y等比例 MM LOENGLISH 每个逻辑单位为001英寸,x向右为正,y向上为正 MM LOMETRIC 每个逻辑单位为0.1毫米,x向右为正,y向上为正 MM TWIPS 每个逻辑单位为一个点的1/20(一个点是1/72英寸), x向右为正,y向上为正
8.1 概述 8.1.1 设备环境类 (1) CPaintDC CPaintDC类的构造函数会自动调用BeginPaint,而它的析构函数则会自动调用EndPaint。 (2) CClientDC 和CWindowDC CWindowDC和CClientDC构造函数分别调用GetWindowDC和GetDC,但它们的析构函数 都是调用ReleaseDC函数。 (3) CMetaFileDC CMetaFileDC封装了在一个Windows图元文件中绘图的方法。 8.1.1 坐标映射 为了能保证打印的结果不受设备的影响,Windows定义了一些映射模式,这些映射模式决 定了设备坐标和逻辑坐标之间的关系。它们是: MM_TEXT 每个逻辑单位等于一个设备像素,x向右为正,y向下为正 MM_HIENGLISH 每个逻辑单位为0.001英寸,x向右为正,y向上为正 MM_HIMETRIC 每个逻辑单位为0.01毫米,x向右为正,y向上为正 MM_ANISOTROPIC x,y可变比例 MM_ISOTROPIC x,y等比例 MM_LOENGLISH 每个逻辑单位为0.01英寸,x向右为正,y向上为正 MM_LOMETRIC 每个逻辑单位为0.1毫米,x向右为正,y向上为正 MM_TWIPS 每个逻辑单位为一个点的1/20(一个点是1/72 英寸), x向右为正,y向上为正
81概述 在 MM ISOTROPIC映射模式下,纵横比总是1:1,换句话说,无论比例因子如何变化,圆总 是圆的;但在 MM ANISOTROPIO映射模式下,x和y的比例因子可以独立地变化,即圆可以 被拉扁成椭圆形状。 将一个椭圆绘制在视窗中央,且当视图的大小发生改变时,椭圆的形状也会随之改变: void CMy View: On Draw(CDC* pDC) CRect rectclient GetClientRect(rectClient) ∥获得当前窗口的客户区大小 DC-> SetMap Mode( MM ANISOTROPIC);∥设置 MM ANISOTROPIC映射模式 DC->Set WindowExt(1000, 1000) ∥设置窗口范围 DC-> Set ViewportExt( rectClient. right, -rectClient bottom)∥设置视口范围 pDC-> Set ViewportOrg(rectClient right/2, rectClient. bottom/2)∥设置视口原点 DC->Ellipse( CRect(-500,-500, 500, 500)) 813图形设备接口 1.使用GD对象 在选择GD对象进行绘图时,往往遵循着下列的步骤 (1)在堆栈中定义一个GD对象(如CPen、 CBrush对象),然后用相应的函数(如 CreatePen Create SolidBrush)创建此GDI对象
8.1 概述 在MM_ISOTROPIC映射模式下,纵横比总是1:1,换句话说,无论比例因子如何变化,圆总 是圆的;但在MM_ANISOTROPIC映射模式下,x和y的比例因子可以独立地变化,即圆可以 被拉扁成椭圆形状。 将一个椭圆绘制在视窗中央,且当视图的大小发生改变时,椭圆的形状也会随之改变: void CMyView::OnDraw(CDC* pDC) { CRect rectClient; GetClientRect(rectClient); // 获得当前窗口的客户区大小 pDC->SetMapMode(MM_ANISOTROPIC);// 设置MM_ANISOTROPIC映射模式 pDC->SetWindowExt(1000,1000); // 设置窗口范围 pDC->SetViewportExt(rectClient.right,-rectClient.bottom);// 设置视口范围 pDC->SetViewportOrg(rectClient.right/2,rectClient.bottom/2);// 设置视口原点 pDC->Ellipse(CRect(-500,-500,500,500)); } 8.1.3 图形设备接口 1. 使用GDI对象 在选择GDI对象进行绘图时,往往遵循着下列的步骤: (1) 在堆栈中定义一个GDI对象(如CPen、CBrush对象),然后用相应的函数(如CreatePen、 CreateSolidBrush)创建此GDI对象
81概述三 (2)将构造的GD对象选入当前设备环境中,但不要忘记将原来的GDI对象保存起来 (3)绘图结束后,恢复当前设备环境中原来的GDI对象。 (4)由于GD对象是在堆栈中创建中,当程序结束后,框架会自动删除程序创建的GD对象。 具体操作可像下面的代码过程 void CMy View: OnDraw( CDC* pDC) CPen penBlack ∥定义一个画笔变量 penBlack CreatePen( PS SOLID,2,RGB(0,0,0),∥创建画笔 ∥将此画笔选入当前设备环境并保存原来的画笔 CPen"pOldPen=pDC-SelectObject( &penBlack ∥用此画笔绘图 pDC->Move To() pDC->Line To(.) pDC->SelectObject( pOldPen ) ∥恢复设备环境中原来的画笔 库存的GD对象 Windows包含了一些库存的可以利用的GD对象。CDC的成员函数 Select StockObject可 以把一个库存对象选入当前设备环境中,并返回原先被选中的对象指针,同时使原先被选中 的对象从设备环境中分离出来。如下面的代码
8.1 概述 (2) 将构造的GDI对象选入当前设备环境中,但不要忘记将原来的GDI对象保存起来。 (3) 绘图结束后,恢复当前设备环境中原来的GDI对象。 (4) 由于GDI对象是在堆栈中创建中,当程序结束后,框架会自动删除程序创建的GDI对象。 具体操作可像下面的代码过程: void CMyView::OnDraw( CDC* pDC ) { CPen penBlack; // 定义一个画笔变量 penBlack.CreatePen( PS_SOLID, 2, RGB(0,0,0)); // 创建画笔 // 将此画笔选入当前设备环境并保存原来的画笔 CPen* pOldPen = pDC->SelectObject( &penBlack ); // 用此画笔绘图 pDC->MoveTo(...); pDC->LineTo(...); pDC->SelectObject( pOldPen ); // 恢复设备环境中原来的画笔 } 2. 库存的GDI对象 Windows包含了一些库存的可以利用的GDI对象。CDC的成员函数SelectStockObject可 以把一个库存对象选入当前设备环境中,并返回原先被选中的对象指针,同时使原先被选中 的对象从设备环境中分离出来。如下面的代码:
8.1概述 void CMy View: OnDraw( CDC* pDC CPen newPen( PS Solid, 2, rGb(0,0,0))) pDC->SelectObject( &newPen pDC-> MoveTo(…) pDC-> Lineto(…); pDC-> Select Object( BLACK PEN);∥ newMen被分离出来 函数 Selectstockobject可选用的库存GD对象类型可以是下列值之 BLACK BRUSH 黑色画刷 DKGRAY BRUSH 深灰色画刷 GRAY BRUSH 灰色画刷 HOLLOW BRUSH 中空画刷 LTGRAY BRUSH 浅灰色画刷 NULL BRUSH 空画刷 WHITE BRUSH 白色画刷 BLACK PEN 黑色画笔 NULL PEN 空画笔 WHITE PEN 白色画笔 DEVICE DEFAULT FONT设备默认字体 SYSTEM FONT 系统字体
8.1 概述 void CMyView::OnDraw( CDC* pDC ) { CPen newPen( PS_SOLID, 2, RGB(0,0,0) ) ) pDC->SelectObject( &newPen ); pDC->MoveTo(...); pDC->LineTo(...); pDC->SelectStockObject( BLACK_PEN ); // newPen被分离出来 } 函数SelectStockObject可选用的库存GDI对象类型可以是下列值之一: BLACK_BRUSH 黑色画刷 DKGRAY_BRUSH 深灰色画刷 GRAY_BRUSH 灰色画刷 HOLLOW_BRUSH 中空画刷 LTGRAY_BRUSH 浅灰色画刷 NULL_BRUSH 空画刷 WHITE_BRUSH 白色画刷 BLACK_PEN 黑色画笔 NULL_PEN 空画笔 WHITE_PEN 白色画笔 DEVICE_DEFAULT_FONT 设备默认字体 SYSTEM_FONT 系统字体