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; 通过计算当前行文本字符的高度与行间隔之和,即可 得到换行时文本的起始坐标