66
§3 Windows 图图图图图图图图图 1. 图图 WM_PAINT 图图 2. 图图图图图图 (GDI) 3. 图图图图图图图 3. 图图图图图图图图图 5. CDC 图图图图图 6. 图图 CDC 图图图图图图图图 7. 图图 CDC 图图图图图图图图 8. 图图图图 GDI 图图 9. 图图图图图图图图图 10. OpenGL 图图

§3   Windows 图形设备接口及绘图

  • Upload
    rico

  • View
    118

  • Download
    0

Embed Size (px)

DESCRIPTION

§3   Windows 图形设备接口及绘图. 1. 响应 WM_PAINT 消息 2. 图形设备接口 (GDI) 3. 使用设备描述表 3. 获取设备描述表句柄 5. CDC 及其派生类 6. 使用 CDC 成员函数绘制文本 7. 使用 CDC 成员函数绘制图形 8. 正确使用 GDI 对象 9. 设备坐标与逻辑坐标 10. OpenGL 绘图. 实验作业. 习题 2,3,4. §3.1 响应 WM_PAINT 消息. WM_PAINT 消息的产生 无效矩形 打开一个窗口 改变窗口大小 移动窗口 切换窗口 - PowerPoint PPT Presentation

Citation preview

Page 1: §3    Windows  图形设备接口及绘图

§3   Windows 图形设备接口及绘图

1. 响应 WM_PAINT 消息2. 图形设备接口 (GDI)

3. 使用设备描述表3. 获取设备描述表句柄5. CDC 及其派生类6. 使用 CDC 成员函数绘制文本7. 使用 CDC 成员函数绘制图形8. 正确使用 GDI 对象9. 设备坐标与逻辑坐标10. OpenGL 绘图

Page 2: §3    Windows  图形设备接口及绘图

实验作业

1.习题 2,3,4

Page 3: §3    Windows  图形设备接口及绘图

1. WM_PAINT 消息的产生 无效矩形

打开一个窗口 改变窗口大小 移动窗口 切换窗口 最小化、最大化窗口 调用 InvalidateRect 函数 调用 UpdateWindow 函数

2. 响应 WM_PAINT 消息 OnPaint

§3.1 响应 WM_PAINT 消息

Page 4: §3    Windows  图形设备接口及绘图

§3.2 图形设备接口 (GDI)

1 .  图形设备接口—提供专门的数据结构即设备描述表( DC )和对 DC操作的绘图函数。

2 .  设备描述表( DC )—用于代表图形输出设备如显示屏、打印机;

3 .  设备无关性—利用 GDI ,所有的绘图操作都对设备描述表而不是具体的物理设备。

Page 5: §3    Windows  图形设备接口及绘图

设备描述表• 一种专门用于代表图形输出设备 ( 如屏幕、打

印机和绘图仪等 ) 的数据结构– 画布– 绘图工具 ( 设备描述表属性 )

• 使用句柄 (HDC) 访问设备描述表 – 设置设备描述表属性– 绘制图形和文本

Page 6: §3    Windows  图形设备接口及绘图

设备描述表属性 缺省值 设置属性值函数 获取属性值函数映射方式 MM_TEXT SetMapMode GetMapMode

窗口原点 (0,0) SetWindowOrg GetWindowOrgOffsetWindowOrg

视口原点 (0,0) SetViewportOrg GetViewportOrgOffsetViewportOrg

窗口限度 (1,1) SetWindowExt GetWindowExtSetMapMode

视口限度 (1,1) SetViewportExt GetViewportExtSetMapMode

画笔 BLACK_PE SelectObject SelectObject

画刷 WHITE_BRUSH SelectObject SelectObject

字模 SISTEM_FONT SelectObject SelectObject

位图 NONE SelectObject SelectObject

当前画笔位置 (0,0) MoveToLineTo

GetCurrentPosition

背景方式 OPAQUE SetBkMode GetBkMode

背景色彩 White SetBkColor GetBkColor

文本色彩 Black SetTextColor GetTextColor

作图方式 R2_COPYPEN SetROP2 GetROP2

伸展方式 BLACK_ONWHIE SetPollyFillMode GetPollyFillMode

多边形填充方式 ALTERNATE SetPollyFillMode GetPollyFillMode

字符间距 0 SetTextCharacterExtra GetTextCharacterExtra

画刷原点 (0,0)屏幕坐标 SetBrushOrg GetBrushOrg

裁剪区 NONE SelectObjectSelectClipRgnIntersectClipRectOffsetClipRgnExcludeClipRect

SelectObjectGetClipBox

设备描述表属性

Page 7: §3    Windows  图形设备接口及绘图

GDI 对象• 画笔• 画刷• 字体• 位图• 裁剪区

Page 8: §3    Windows  图形设备接口及绘图

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

RECT rt;

GetClientRect(hWnd, &rt);

SetTextColor(hdc,RGB(255,0,0));

SetBkColor(hdc,RGB(0,0,255));

DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);

EndPaint(hWnd, &ps);

break;

Page 9: §3    Windows  图形设备接口及绘图

(1)  获取设备描述表句柄(2)   设置设备描述表属性(3)   调用绘图函数绘图(4)   释放设备描述表

3.3   使用设备描述表绘图

Page 10: §3    Windows  图形设备接口及绘图

1. BeginPaint 和 EndPaint 函数 (1) BeginPaint function• 准备在窗口绘图• 获得代表窗口的设备描述表句柄• 把有关绘图的信息放到 PAINTSTRUCT 结构

变量中。• 响应 WM_PAINT 消息绘图,必须调用该函数

获取设备描述表句柄。

3.4 获取窗口设备描述表句柄

Page 11: §3    Windows  图形设备接口及绘图

HDC BeginPaint( HWND hwnd, // handle to window

LPPAINTSTRUCT lpPaint // pointer to structure for paint information);

•函数原型:

Page 12: §3    Windows  图形设备接口及绘图

PAINTSTRUCT • typedef struct tagPAINTSTRUCT {

HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32];

} PAINTSTRUCT

Page 13: §3    Windows  图形设备接口及绘图

• 标志对指定窗口的绘图结束•释放设备描述表句柄•必须与 BeginPaint 函数成对调用•函数原型

BOOL EndPaint( HWND hWnd,

CONST PAINTSTRUCT *lpPaint

);

(2) EndPaint function

Page 14: §3    Windows  图形设备接口及绘图

2.GetDC 和 RealeaseDC 函数( 1 ) GetDC function获取窗口设备描述表句柄用于响应非 WM_PAINT 消息绘图。函数原型:HDC GetDC( HWND hWnd );

Page 15: §3    Windows  图形设备接口及绘图

( 2 ) ReleaseDC function

释放设备描述表句柄必须与 GetDC 函数成对调用函数原型:int ReleaseDC(HWND hWnd, // handle to window

HDC hDC // handle to device context);

Page 16: §3    Windows  图形设备接口及绘图

3.5 CDC 及其派生类CDC: 封装了所有与设备描述表有关的

数据和操作。 绘图函数: Ellipse()… 文本输出: TextOut()… 设置设备描述表属性: SelectObject(),

SetTextColor()…

数据成员 m_hdc :设备描述表句柄。

Page 17: §3    Windows  图形设备接口及绘图

CPaintDC: construction CWnd::BeginPaint destruction CWnd::EndPaint

CClientDC : construction CWnd::GetDC destruction CWnd::ReleaseDC

CWindowDC GetWindowDC ReleaseDC

 

Page 18: §3    Windows  图形设备接口及绘图

3.6 GDI 对象与 CGDIObject类

• GDI 对象与句柄• 使用 GDI 对象• 使用 CGDIObject 类

Page 19: §3    Windows  图形设备接口及绘图

句柄 对象HGDI OBJ 所有 GDI 对象HBRUSH 画刷HPEN 画笔HBI TMAP 位图HRGN 区域HPALETTE 调色板

GDI 对象与句柄

Page 20: §3    Windows  图形设备接口及绘图

使用 GDI 对象基本规则 (1)    创建对象

(2)   用 SelectObject 函数把新创建的对象选入设备描述表,并保留原对象(3)   完成绘图函数的调用后,把旧对象选入设备描述表,置换出创建的对象(4)    删除创建的对象 , 由 DeleteObject 函数完成

Page 21: §3    Windows  图形设备接口及绘图

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

HPEN hNewPen,hOldPen;

hNewPen=CreatePen(PS_DASH,1,RGB(255,0,0));

hOldPen=(HPEN)SelectObject(hdc,hNewPen);

MoveToEx(hdc,0,0,NULL);

LineTo(hdc,100,100);

hNewPen=(HPEN)SelectObject(hdc,hOldPen);

DeleteObject(hNewPen);

EndPaint(hWnd, &ps);

break;

Page 22: §3    Windows  图形设备接口及绘图

使用 CGDIObject 类

• 数据成员 m_hObject• Attach 函数 Detach 函数• 派生类 : CPen 、 CBrush 、 CFont 、 C

Bitmap 、 CPallete 和 CRgn 类

Page 23: §3    Windows  图形设备接口及绘图

逻辑坐标系TextOut(hdc, x,y,szBuffer,nLength) 设备坐标系 屏幕坐标系 窗口坐标系 窗口工作区坐标系 视口(设备坐标)与窗口(逻辑坐标)

§3.7 设备坐标与逻辑坐标

Page 24: §3    Windows  图形设备接口及绘图

映像模式 定义了逻辑坐标与设备坐标的转换 CDC:: SetMapMode();

映射模式 逻辑单元 坐标轴方向MM_TEXT 象素 X:向右 Y:向下MM_I SOTROPI C 任意(X=Y) X:向右 Y:向上MM_ANI SOTROPI C 任意(X!=Y) X:向右 Y:向上MM_HI ENGLI SH 0. 001英寸 X:向右 Y:向上MM_HI METRI C 0. 01MM X:向右 Y:向上MM_LOENGLI SH 0. 01英寸 X:向右 Y:向上MM_LOMETRI C 0. 1MM X:可选 Y:可选MM_TWI PS 1/1440英寸 X:可选 Y:可选

Page 25: §3    Windows  图形设备接口及绘图

• 窗口原点和视口原点– 调整逻辑坐标的原点

• 窗口限度和视口限度– 调整逻辑坐标轴的方向和单位

• 逻辑坐标与设备坐标的转换公式– xViewport=(xWindow-xWinOrg)*(xViewExt/xW

inExt)+xViewOrg;– yViewport=(yWindow-yWinOrg)*(yViewExt/y

WinExt)+xViewOrg;

Page 26: §3    Windows  图形设备接口及绘图

• 设置逻辑坐标系的原点– SetViewportOrgEx 函数

BOOL SetViewportOrgEx(

HDC hdc, // 设备描述表句柄 int X, // 使用设备单位,视口原点的 X 坐标值 int Y, // 使用设备单位,视口原点的 Y 坐标值 LPPOINT lpPoint // 指向 POINT 结构变量,存放

原始的视口原点坐标 );

SetViewportOrgEx(hdc,cx/2,cy/2,NULL);

Page 27: §3    Windows  图形设备接口及绘图

– SetWindowOrgExBOOL SetWindowOrgEx(

HDC hdc, // 设备描述表句柄 int X, // 使用逻辑单位,窗口原点的 X 坐标值 int Y, // 使用逻辑单位,窗口原点的 Y 坐标值 LPPOINT lpPoint // 指向 POINT 结构变量,存

放原始的窗口原点坐标 )• SetWindowOrgEx(hdc,-cx/2,-cy/2,NULL);

Page 28: §3    Windows  图形设备接口及绘图

1. 设置映射方式 MM_ANISOTROPIC , MM_ISOTROPIC (做适当调整)2. 设置窗口限度

SetWindowExt()BOOL SetWindowExtEx( HDC hdc, // 设备描述表句柄 int nXExtent, // 新设置的水平方向窗口限度 int nYExtent, // 新设置的垂直方向窗口限度 LPSIZE lpSize // 原始窗口限度);

任意逻辑坐标系的设置

Page 29: §3    Windows  图形设备接口及绘图

3. 设置视口限度BOOL SetViewportExtEx(

HDC hdc, // 设备描述表句柄 int nXExtent, // 新设置的水平方向视口限度 int nYExtent, // 新设置的垂直方向视口限度 LPSIZE lpSize // 原始视口限度);

Page 30: §3    Windows  图形设备接口及绘图

坐标系的转换1. DPToLP()2. LPToDP()3. ClientToScreen()4. ScreenToClient()

Page 31: §3    Windows  图形设备接口及绘图

3.8 使用 CDC 类绘制图形• 绘制点和线

– COLORREF SetPixel( POINT point, COLORREF crColor );

– CPoint MoveTo( POINT point );– BOOL LineTo( POINT point );

– BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd );

– BOOL AngleArc( int x, int y, int nRadius, float fStartAngle, float fSweepAngle );

Page 32: §3    Windows  图形设备接口及绘图

– BOOL Polyline( LPPOINT lpPoints, int nCount );

– BOOL PolyPolyline( const POINT* lpPoints, const DWORD* lpPolyPoints, int nCount );

– BOOL PolyBezier( const POINT* lpPoints, int nCount );

Page 33: §3    Windows  图形设备接口及绘图

• 绘制封闭图形– BOOL Ellipse( LPCRECT lpRect );– BOOL Rectangle( LPCRECT lpRect )– BOOL RoundRect( LPCRECT lpRect, POIN

T point );– BOOL Pie( LPCRECT lpRect, POINT ptStar

t, POINT ptEnd );– BOOL Polygon( LPPOINT lpPoints, int nC

ount );– BOOL PolyPolygon( LPPOINT lpPoints, LP

INT lpPolyCounts, int nCount );

Page 34: §3    Windows  图形设备接口及绘图

• CPen 类和画笔

函数原型 说明CPen( ); 构造 Cpen对象CPen( int nPenStyle, int nWidth,COLORREF crColor );

构造 Cpen对象,并创建样式为 nPenStyle,宽度为 nWidth,颜色为 crColor的 GDI画笔对象

BOOL CreatePen( int nPenStyle, int nWidth,COLORREF crColor );

并创建样式为 nPenStyle,宽度为 nWidth,颜色为 crColor的 GDI画笔对象

BOOL CreatePenIndirect( LPLOGPENlpLogPen );

创建 GDI 画笔对象,参数为 lpLogPen 指向 LOGPEN结构对象。

LOGPEN结构的定义如下:typedef struct tagLOGPEN { /* lgpn */ UINT lopnStyle; //画笔样式 POINT lopnWidth; //画笔宽度 COLORREF lopnColor; //画笔颜色} LOGPEN;

Page 35: §3    Windows  图形设备接口及绘图

样式 线形PS_SOLID

PS_DASH

PS_DOT

PS_DASHDOT

PS_DASHDOTDOT

PS_NULL

PS_INSIDEFRAME

Page 36: §3    Windows  图形设备接口及绘图

(1) 调用带参数的构造函数创建 GDI 画笔对象,例如: Cpen m_Pen (PS_SOLID,1,RGB(0,0,255));

(2)先调用缺省构造函数创建 CPen 对象,然后调用 Indirect 函数创建 GDI 画笔对象,例如:

Cpen m_Pen;

LOGPEN logpen ; logpen .lopnStyle=PS_SOLID; // 画笔样式 logpen .lopnWidth=1; // 画笔宽度 logpen .lopnColor=RGB(0,0,255);

m_Pen. CreatePenIndirect(&logpen );

Page 37: §3    Windows  图形设备接口及绘图

• 1 . 画刷和 CBrush 类函数原型 说明CBrush( ); 构造 CBrush对象CBrush( COLORREF crColor ); 构造 CBrush 对象,并创建实心画刷,颜

色由参数 crColor指定CBrush( int nIndex, COLORREF crColor ); 构造 CBrush 对象,并创建阴影线画刷,

阴影线样式由 nIndex指定,颜色由 crColor指定

CBrush( CBitmap* pBitmap ); 构造 CBrush 对象,并创建位图画刷,位图由 pBitmap指定

BOOL CreateSolidBrush( COLORREFcrColor );

创建实心画刷,颜色由参数 crColor指定

BOOL CreateHatchBrush( int nIndex,COLORREF crColor );

创建阴影线画刷,阴影线样式由 nIndex指定,颜色由 crColor指定

BOOL CreateBrushIndirect( constLOGBRUSH* lpLogBrush );

创建画刷,画刷类型由 lpLogBrush 指向的 LOGBRUSH结构变量指定

BOOL CreatePatternBrush( CBitmap*pBitmap );

创建位图画刷,位图由 pBitmap指定

Page 38: §3    Windows  图形设备接口及绘图

LOGBRUSH 的结构定义如下:typedef struct tagLOGBRUSH { // lb

UINT lbStyle;

COLORREF lbColor;

LONG lbHatch;

} LOGBRUSH; LbStyle 画刷类型BS_HATCHED 阴影线画刷BS_HOLLOW, BS_NULL 空心画刷BS_PATTERN,BS_PATTERN8X8 位图画刷BS_SOLID 实心画刷

Page 39: §3    Windows  图形设备接口及绘图

样式 阴影线图式HS_HORIZONTAL

HS_VERTICAL

HS_FDIAGONAL

HS_BDIAGONAL

HS_CROSS

HS_DIAGCROSS

阴影线的样式:

Page 40: §3    Windows  图形设备接口及绘图

( 1 )创建实心画刷使用带参数的构造函数创建CBrush brush(RGB(255,0,0));

先使用缺省的构造函数创建 Cbrush 对象,然后调用成员函数创建画刷

CBrush brush ; brush.CreateSolidBrush(RGB(255,0,0))

Page 41: §3    Windows  图形设备接口及绘图

( 2 ) 创建阴影线画刷使用带参数的构造函数创建,例如 :

CBrush brush(HS_DIAGCROSS,RGB(0,255,0));

先使用缺省的构造函数创建 Cbrush 对象,然后调用成员函数创建画刷。如:

CBrush brush;

brush.CresteHatchBrush(HS_DIAGCROSS,RGB(0,255,0));

Page 42: §3    Windows  图形设备接口及绘图

( 3 )创建位图画刷– 准备一个位图对象

• CBitmap bitmap ;• bitmap.LoadBitmap(IDB_BITMAP1);

– 使用 CBrush 类带参数的构造函数创建位图画刷,例如 :

• CBrush brush(&bitmap);

– 先使用缺省的构造函数创建 Cbrush 对象,然后调用成员函数创建画刷。例如:

• CBrush brush;• brush.CrestePatternBrush(&bitmap);

Page 43: §3    Windows  图形设备接口及绘图

1 . TextOut 2 . DrawText-- 在指定矩形区域以一定格式输出字符串

DT_BOTTOM DT_CENTERDT_LEFT DT_RIGHTDT_SINGLELINEDT_TOPDT_VCENTER …

3.9 使用 CDC 成员函数绘制文本 文本输出函数

Page 44: §3    Windows  图形设备接口及绘图

3. ExtTextOut• 函数功能:在指定位置输出字符串,并且在文本周围给矩形填充背景色。

• 函数原型: BOOL ExtTextOut( int x, int y, UINT nOptions, LPCRECT lpRect, const CString& str, LPINT lpDxWidths );

参数 说明x,y 字符串输出起始位置 x,y坐标NOpti ons 指定矩形框的样式;如果设置为 ETO_CLI PPED则字符串被矩形框剪切,

如果设置为 ETO_OPAQUE则矩形框将被背景色填充。LpRect 指定矩形,可以设置为 NULL。Str 绘制的字符串LpDxWi dths

指向一个数组;数组元素 i 的值决定了第 I 个字符与第 I +1个字符的间隔距离;可以设置为 NULL。

Page 45: §3    Windows  图形设备接口及绘图

void CChildView::OnPaint()

{

CPaintDC dc(this); // device context for painting

dc.SetBkColor(RGB(0,255,0));

CRect rect(0,0,200,40);

int array[5]={40,25,35,45,15};

dc.ExtTextOut(10,10,ETO_CLIPPED|ETO_OPAQUE,&rect,CString("hello"),array);

}

Page 46: §3    Windows  图形设备接口及绘图

4.TabbedTextOut 函数• 函数功能:和 TextOut() 的差不多,只是它支持制表符,定义一组制表符的位置。

• 函数原型: CSize TabbedTextOut( int x, int y, const CString& str,

• int nTabPositions, LPINT lpnTabStopPositions, int nTabOrigin );

参数 说明x,y 字符串输出起始位置 x,y坐标Str 绘制的字符串NTabPosi ti ons 指定制表符的个数LpnTabStopPosi ti ons 指向一个存放制表符位置的数组NTabOri gi n 制表符的扩展宽度

Page 47: §3    Windows  图形设备接口及绘图

void CChildView::OnPaint()

{

CPaintDC dc(this); // device context for painting

int array[3]={80,140,200};

dc.TabbedTextOut(0,0,CString("hello\thow\tare\tyou"),0,NULL,0);

dc.TextOut(0,180,CString("hello\thow\tare\tyou"));

}

Page 48: §3    Windows  图形设备接口及绘图

1. SetTextAlignTA_BASELINE

TA_BOTTOM

TA_TOP

TA_CENTER

TA_LEFT

TA_RIGHT …

文本格式控制

Page 49: §3    Windows  图形设备接口及绘图

2. SetTextCharacterExtra• 函数功能:设置字符间距• 函数原型: int SetTextCharacterExtra(

int nCharExtra );•参数说明: nCharExtra为添加的空白数

(逻辑单位)

Page 50: §3    Windows  图形设备接口及绘图

3. SetTextJustification• 函数功能 : 设置词间距• 函数原型: int SetTextJustification( int nB

reakExtra, int nBreakCount );

•参数说明: nBreakExtra 为所有空格添加的空白数(逻辑单位); nBreakCount 为一行字符串中的空格数。

Page 51: §3    Windows  图形设备接口及绘图

GetTextExtent 函数• 函数原型: CSize GetTextExtent( const C

String& str )

• 函数功能: 返回输出字符串 str 所占用的显示空间(逻辑单位)

Page 52: §3    Windows  图形设备接口及绘图

void CChildView::OnPaint()

{

CPaintDC dc(this); dc.SetTextAlign(TA_RIGHT);

dc.TextOut(100,20,CString("right aligned"));

dc.SetTextAlign(TA_LEFT);

dc.TextOut(100,60,CString("left aligned"));

int oldextra=dc.SetTextCharacterExtra(5);

dc.TextOut(100,100,CString("left aligned and add 5 extra"));

Page 53: §3    Windows  图形设备接口及绘图

CSize size=dc.GetTextExtent(CString("left aligned and add 5 extra and justified"));

CRect rect;

GetClientRect(&rect);

dc.SetTextJustification(rect.Width()-size.cx,7);

dc.TextOut(0,140,CString("left aligned and add 5 extra and justified"));

dc.SetTextCharacterExtra(oldextra);

dc.SetTextJustification(0,0);

dc.TextOut(100,180,CString("left aligned"));

}

Page 54: §3    Windows  图形设备接口及绘图

3.6.3 获取文本尺寸

1.GetTextMetrics2.GetTextExtentPoint

typedef struct tagTEXTMETRIC

{ LONG tmHeight; LONG tmAscent; LONG tmDescent; LONG tmInternalLeading; LONG tmExternalLeading; LONG tmAveCharWidth; LONG tmMaxCharWidth; LONG tmWeight; … } TEXTMETRIC;

Page 55: §3    Windows  图形设备接口及绘图

设置字符和背景颜色

(1)SetTextColor 函数(2)SetBKColor 函数

Page 56: §3    Windows  图形设备接口及绘图

CFont 类与字体• Windows 字体

– 栅格型 (Raster)– 矢量型 (Vector)– TrueType

• 字体要素– 字型(字体名称)– 字型样式(字体样式)– 大小(从低端到顶端的距离)

Page 57: §3    Windows  图形设备接口及绘图

成员类型

成员名 使用说明

LONG l fHei ght 字符高度(使用逻辑单位)设置为 0时,使用缺省高度

LONG l fWi dth 字符平均宽度, 设置为 0时,使用匹配宽度LONG l fEscapement 字符与 X轴的角度,缺省为 0LONG l fOri entati on 字符排列角度,值为角度*10,如 900代表 90度,

1800为逆向LONG l fWei ght 字符中线的粗细度, 取值范围:

FW_DONTCARE, FW_THI N, …FW_NORMAL, FW_REGULAR….FW_BOLD, . . FW_BLACK, FW_HEAVY

BYTE l f I tal i c 非 0为斜体BYTE l fUnderl i ne 非 0为加下划底线BYTE l fStri keOut 非 0为在字符中央加线

Page 58: §3    Windows  图形设备接口及绘图

BYTE l fCharSet 字符集,可以设置以下字符集:ANSI _CHARSET,DEFAULT_CHARSET,SYMBOL_CHARSET,SHI FTJ I S_CHARSET,HANGUL_CHARSET,GB2312_CHARSET,…

BYTE l fOutPreci si on 精确度: OUT_DEFAULT_PRECI S,OUT_DEVI CE_PRECI S, (devi ce)OUT_RASTER_PRECI S, (Raser)OUT_TT_ONLY_PRECI S(onl y true type)OUT_TT_PRECI S(true type)

BYTE l fCl i pPreci si on 裁剪字符的方法: CLI P_DEFAULT_PRECI SBYTE l fQual i ty 字体质量: DEFAULT_QUALI TY

DRAFT_QUALI TY, PROOF_QUALI TYBYTE l fPi tchAndFami l y 宽度种类与字体家族,可以设置以下值:

宽度种类: DEFAULT_PI TCH,VARI ABLE_PI TCH, FI XED_PI TCH字体家族:FF_DECORATI VE(Ol d Engl i sh),FF_DONTCARE,FF_MODERN(Couri er New),FF_ROMAN(Ti mesNewRoman),FF_SCRI PT(Scri pt),FF_SWI SS(Ari al)

TCHAR l fFaceName[LF_FACESIZE]

字体名称

Page 59: §3    Windows  图形设备接口及绘图

获取字体尺寸信息• GetTextMetrics 函数• BOOL GetTextMetrics ( LPTEXTMETRI

C lptm )

Page 60: §3    Windows  图形设备接口及绘图

typedef struct tagTEXTMETRIC

{ int tmHeight;

int tmAscent;

int tmDescent;

int tmInternalLeading;

int tmExternalLeading;

int tmAveCharWidth;

int tmMaxCharWidth;

int tmWeight;

Page 61: §3    Windows  图形设备接口及绘图

BYTE tmItalic;

BYTE tmUnderlined;

BYTE tmStruckOut;

BYTE tmFirstChar;

BYTE tmLastChar;

BYTE tmDefaultChar;

BYTE tmBreakChar;

BYTE tmPitchAndFamily;

BYTE tmCharSet;

int tmOverhang;

int tmDigitizedAspectX;

int tmDigitizedAspectY;

} TEXTMETRIC;

Page 62: §3    Windows  图形设备接口及绘图

使用 CFont 类创建字体• 构造 CFont 对象• 调用成员函数创建字体对象

– CreateFontIndirect 函数• 函数原型: BOOL CreateFontIndirect(const L

OGFONT* lpLogFont );•参数说明: lpLogFont 就是 LOGFONT 的指针

类型。

Page 63: §3    Windows  图形设备接口及绘图

– (2)CreateFont 函数• 函数原型: BOOL CreateFont( int nHeight, in

t nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename );

Page 64: §3    Windows  图形设备接口及绘图

– (3)CreatePointFont 函数• 函数原型: BOOL CreatePointFont( i

nt nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL );

Page 65: §3    Windows  图形设备接口及绘图

void CChildView::OnPaint()

{ CPaintDC dc(this);

CString fontname[5]={“宋体” ,”隶书” ,”仿宋体” ,”楷书” ,”黑体” } ;LOGFONT flog;

ZeroMemory(&flog,sizeof(flog));

flog.lfHeight=48;

flog.lfWeight=FW_BOLD;

flog.lfCharSet=GB2312_CHARSET;

for(int i=0;i<5;i++)

{ strcpy(flog.lfFaceName,fontname[i]);

CFont font;

font.CreateFontIndirect(&flog);

dc.SelectObject(&font);

dc.TextOut(20,20+i*48,fontname[I];

}

}

Page 66: §3    Windows  图形设备接口及绘图

本章重点及编程要求:

1 .  绘图的基本步骤2 .  设备环境的获取与使用3 .  GDI 对象的使用5 .  逻辑坐标的设 置