第5讲文本与字体 Windows经常使用 图形和文本并 GD进行文本输出。在 没有明显的界限 定意义上,任何内容 都可以看成图形实体 使用定义好的与设备无关的字体集, Windows就能维 护它的设备无关性,提供“所见即所得”的好处,即屏幕 所见与设备输出的文本是一样的 先要获得文本句柄 文本 操作设置字体、字符大小、字符颜色等有关属性 将这些属性选入设备环境
1 第5讲 文本与字体 使用定义好的与设备无关的字体集,Windows就能维 护它的设备无关性,提供“所见即所得”的好处,即屏幕 所见与设备输出的文本是一样的 Windows经常使用 GDI进行文本输出。在 一定意义上,任何内容 都可以看成图形实体 图形和文本并 没有明显的界限 文本 操作 先要获得文本句柄 设置字体、字符大小、字符颜色等有关属性 将这些属性选入设备环境
51设置文本的设备环境 win系统 描述所要显示 提供了七种 的文本的大小 基本字体 类型和外形 物理字体是为特殊设备设计的,因而是设备相关的 字体 逻辑字体定义的字符集是设备无关的,它可以精确标度,因 此得到广泛应用 字体 说明 ANSI FIXED ANSI标准的固定宽度的字体 ANSI VAR ANS标准的可变宽度的字体 常作为缺省字体 DEFAULT GUI 当前GUI的缺省字体 Win用它作为 OEM FIXED 由标准原设备制造商(OEM)提供 系统界面字体 DEVICE DEFAULT当前图形设备的字体 SYSTEM FIXED Windows的标准固定宽度的字体 SYSTEM Windows提供的可变宽度的字体
2 5.1 设置文本的设备环境 字体 逻辑字体定义的字符集是设备无关的,它可以精确标度,因 此得到广泛应用 描述所要显示 的文本的大小、 类型和外形 物理字体是为特殊设备设计的,因而是设备相关的 Win 系统 提供了七种 基本字体 字体 说明 ANSI_FIXED ANSI标准的固定宽度的字体 ANSI_VAR ANSI标准的可变宽度的字体 DEFAULT_GUI 当前GUI的缺省字体 OEM_FIXED 由标准原设备制造商(OEM)提供 DEVICE_DEFAULT 当前图形设备的字体 SYSTEM_FIXED Windows的标准固定宽度的字体 SYSTEM Windows提供的可变宽度的字体 常作为缺省字体 Win用它作为 系统界面字体
(1)定义字体句柄变量 HFONT hE;/hF为字体的句柄 选 择 系 统(2)调函数 GetStockobject获得系统字体句柄 字 它返回的是系统的缺省字体 体 hF= Getstockobject(): 的 步 骤(3)调用函数 Selectobject将字体选入设备环 境 Selectobject(hdc, hF
3 (1) 定义字体句柄变量: HFONT hF; //hF为字体的句柄 (2) 调函数GetStockObject获得系统字体句柄 它返回的是系统的缺省字体 hF= GetStockObject( ): (3) 调用函数SelectObject将字体选入设备环 境 SelectObject(hdc,hF); 选 择 系 统 字 体 的 步 骤
512创建自定义字体 若需要定义系统以外的字体,可以调用函数 Greate Font自行创建 HFont=CreateFont (int nHeight //字体高度,0采用系统缺省值,使用逻辑单位 int nWidth //字体宽度,取0则由系统根据高宽比取最佳值 int eScapement,∥/每行文字相对于页底的角度,单位为0.1度 int oRienation,//每个文字相对于页底的角度,单位为0.1度 DW0 RD nWe i ght,/字体粗细度,范围为0~1000 可选的系统字符集: DWORD DwItalic,//如果要求字体倾斜,则取非零 ANSI CHARSET DW0 Rd unDerline,//如果要求下划线,则取非零 OEM CHARSET SYMBOL CHARSET dWORD strikeout,//如果要求中划线,则取非 DEFAULT CHARSET DWORD dwChar set,//字体所属字符集 SHIFTJIS CHARSET DW0 RD dwOutputPrecis ion,//输出精度,一般取缺省值0 UT DEFAULT PREC|S DW0 Rd dwClipPrecision,∥/剪裁精度,常取缺省值CLP_ DEFAULT_PREC|S DWORD dwQual ity //输出质量,一般取缺省值 DEFAULT QUALITY DWORD dwPi tchAndFamily,//字体名
4 5.1.2 创建自定义字体 若需要定义系统以外的字体,可以调用函数GreateFont自行创建 HFont=CreateFont (int nHeight, //字体高度,0采用系统缺省值,使用逻辑单位 int nWidth, //字体宽度,取0则由系统根据高宽比取最佳值 int nEscapement, //每行文字相对于页底的角度,单位为0.1度 int nOrienation, //每个文字相对于页底的角度,单位为0.1度 DWORD nWeight, //字体粗细度,范围为0~1000 DWORD Dwltalic, //如果要求字体倾斜,则取非零 DWORD dwUnderline, //如果要求下划线,则取非零 DWORD dwStrikeout, //如果要求中划线,则取非零 DWORD dwCharset, //字体所属字符集 DWORD dwOutputPrecision,//输出精度,一般取缺省值OUT_DEFAULT_PRECIS DWORD dwClipPrecision, //剪裁精度,常取缺省值CLIP_DEFAULT_PRECIS DWORD dwQuality, //输出质量,一般取缺省值DEFAULT_QUALITY DWORD dwPitchAndFamily, //字体名 ) 可选的系统字符集: ANSI_CHARSET OEM_CHARSET SYMBOL_CHARSET DEFAULT_CHARSET SHIFTJIS_CHARSET
513设置字体和背景颜色 字体及背景颜色 的设置在开发过 程中非常重要 ∫设置字体颜色: SetTextColor(hdc, crColor 设置背景颜色: SetBkco lor(hdc, crcolor); crColor为设置的颜色
5 5.1.3 设置字体和背景颜色 设置字体颜色:SetTextColor(hdc,crColor); 设置背景颜色:SetBkColor(hdc,crColor); crColor为设置的颜色 字体及背景颜色 的设置在开发过 程中非常重要
52文本的输出过程 获取字体信息 确定后续文本坐标 文本输 出过程格式化文本 确定换行时文本坐标 调用函数输出文本p
6 5.2 文本的输出过程 确定后续文本坐标 确定换行时文本坐标 文本输 出过程 获取字体信息 格式化文本 调用函数输出文本
获取字体信鳥 输出文本之前要获取字体的信息,如字符高度 等,以确定输出格式和下一行字符的位置 GetTextMetr ics(hdc,&tm);/tm为 TEXTMETRICS结构 获取当前使 用字体信息 调用该函数时,系统将当前 字体的信息拷贝到tm标识 的 TEXTMETRICS结构中
7 获取字体信息 输出文本之前要获取字体的信息,如字符高度 等,以确定输出格式和下一行字符的位置 GetTextMetrics (hdc,&tm);//tm为TEXTMETRICS结构 获取当前使 用字体信息 调用该函数时,系统将当前 字体的信息拷贝到tm标识 的TEXTMETRICS结构中
系统定义的 TEXTMETRICS的结构如下: typedef struct tagTEXTMETRIC //tm LONG thE i ght //字符高度 LONG tmAscent: 字符基线以上高度 LONG tmDescent 字符基线以下高度 LONG tmInterna Leading: thEi ght制订的字符高度顶部的控件 LONG tmExterna I Lead ing 行与行之间的间隔 ONG tmAveCharWidth //平均字符宽度 LONG tmMaxCharWidth //最大字符宽度 ONG tmWe ight 字符的粗细度 LONG tmOverhang //合成字体间附加的宽度 L0 NG tmDigiti zedAspectX;//为输出设备设计的X轴尺寸 LONG tmDi giti zedAspectY;//为输出设备设计的Y轴尺寸 BCHAR tmFirstChar 字体中第一个字符值 BCHAR tmLastchar 体中最后 BCHAR tmDefaultChar 代替不在字体中字符的字符 BCHAR tmBreakChar 作为分割符的字符 BYTE tmltal ic: 0则表示字体为斜体 BYTE tmUnder ined 非0则表示字体有下划线 BYTE tmStruckOut 删除字体 BYTE tmPi tchAndFami ly 体间距和字体族 BYTE tcHar Set 符集 I TEXTMETRIC
8 系统定义的TEXTMETRICS的结构如下: typedef struct tagTEXTMETRIC { //tm LONG tmHeight; //字符高度 LONG tmAscent; //字符基线以上高度 LONG tmDescent; //字符基线以下高度 LONG tmInternalLeading; //tmHeight制订的字符高度顶部的控件 LONG tmExternalLeading; //行与行之间的间隔 LONG tmAveCharWidth; //平均字符宽度 LONG tmMaxCharWidth; //最大字符宽度 LONG tmWeight; //字符的粗细度 LONG tmOverhang; //合成字体间附加的宽度 LONG tmDigitizedAspectX; //为输出设备设计的X轴尺寸 LONG tmDigitizedAspectY; //为输出设备设计的Y轴尺寸 BCHAR tmFirstChar; //字体中第一个字符值 BCHAR tmLastChar; //字体中最后一个字符值 BCHAR tmDefaultChar; //代替不在字体中字符的字符 BCHAR tmBreakChar; //作为分割符的字符 BYTE tmItalic; //非0则表示字体为斜体 BYTE tmUnderlined; //非0则表示字体有下划线 BYTE tmStruckOut; //非0则表示字符为删除字体 BYTE tmPitchAndFamily; //字体间距和字体族 BYTE tmCharSet; //字符集 }TEXTMETRIC
格式化文本 需要格式化「在文本行中确定后续文本的坐标 处理的情况 换行时确定下一行文本的坐标 (1)确定后续文本坐标 确定后续文本的坐标应先获取当前的字符串的宽度,该工作由 GetTextExtentpoint32函数完成,并把它存储于一个SZE结构中。 SIZE数据结构的定义 BooL GetTextExtentPoint32 typedef struct tagSIzE ILONG CX; HDC hdc LONG cy; LPCTSTR IpszStr ing,//指定的字符串 3 SIZE int nLength //字符串中的字符数 LPS| ZE UpSize//返回字符串宽度及高度的SZE数据结构的地址 例如,X轴起始坐标为cx0,后续文本起始坐标cx1为: cxl=cx0+size. cx
9 格式化文本 (1) 确定后续文本坐标 换行时确定下一行文本的坐标 需要格式化 处理的情况 在文本行中确定后续文本的坐标 确定后续文本的坐标,应先获取当前的字符串的宽度,该工作由 GetTextExtentPoint32函数完成,并把它存储于一个SIZE结构中。 BooL GetTextExtentPoint32 ( HDC hdc, LPCTSTR lpszString,//指定的字符串 int nLength, //字符串中的字符数 LPSIZE lpSize //返回字符串宽度及高度的SIZE数据结构的地址 ) SIZE数据结构的定义 typedef struct tagSIZE { LONG cx; LONG cy; } SIZE; 例如,X轴起始坐标为cx0,后续文本起始坐标cx1为: cx1=cx0+size.cx;
(2)确定换行时文本坐标 通过计算当前行文本字符的高度与行间隔之和,即可 得到换行时文本的起始坐标 字符的高度与行间隔均存储在tm指向的 TEXTMETRICS结 构中,换行时Y轴上文本的起始坐标cy为: cy=tm. tmHeight+tm. tmExternalLeading Retur
10 (2)确定换行时文本坐标 字符的高度与行间隔均存储在tm指向的TEXTMETRICS结 构中,换行时Y轴上文本的起始坐标cy为: cy=tm.tmHeight+tm.tmExternalLeading; 通过计算当前行文本字符的高度与行间隔之和,即可 得到换行时文本的起始坐标