本讲中要使用TextOut函数来在窗口上显示多行文字,首先介绍TextOut函数的用法。
TextOut函数在指定位置写入的字符串,利用当前选择的字体,背景颜色和文本颜色。
BOOL TextOutA(
HDC hdc,
int x,
int y,
LPCSTR lpString,
int c
);
第一个参数hdc为装置内容代号,可以是GetDC的回传值,也可以是在处理WM_PAINT信息的BeginPaint回传值。
第二个参数x和第三个参数y为系统对齐字符的参考点,原点为显示区域的左上角。
第四个参数lpString为指向字符串的指针。
第五个参数c为字符串的长度。
如果想要在视窗中显示多个字符,那么就必须知道字符的大小,在早期的windows版本中,使用的字体为等宽字体即所有的字符都具有相等的宽度,从windows3.0之后,windows的系统字体变成了变宽字体,如大写W字符要比小写的a字符宽。windows的系统字体是一种点阵字体。
字元大小
对于不同的分辨率,会有不同的大小的系统字体,可以通过GetTextMetrics
获得字体大小的信息,windows对于不同字体的信息存放在TEXTMETRIC 结构体中
typedef struct tagTEXTMETRICA {
LONG tmHeight;
LONG tmAscent;
LONG tmDescent;
LONG tmInternalLeading;
LONG tmExternalLeading;
LONG tmAveCharWidth;
LONG tmMaxCharWidth;
LONG tmWeight;
LONG tmOverhang;
LONG tmDigitizedAspectX;
LONG tmDigitizedAspectY;
BYTE tmFirstChar;
BYTE tmLastChar;
BYTE tmDefaultChar;
BYTE tmBreakChar;
BYTE tmItalic;
BYTE tmUnderlined;
BYTE tmStruckOut;
BYTE tmPitchAndFamily;
BYTE tmCharSet;
} TEXTMETRICA, *PTEXTMETRICA, *NPTEXTMETRICA, *LPTEXTMETRICA;
第一个参数tmHeight为字符的高度(tmAscent+tmDescent 上升+下降)。
第二个参数tmAscent为字符的上升(基线上方的单位)。
第三个参数tmDescent为字符的下降(基线下方的单位)。
第四个参数tmInternalLeading为tmHeight成员设置的边界内的前导(空格)量,通常是用来标注重音,可以设置为0。
第五个参数tmExternalLeading为它是字体设计者建议加在横向字元之间的空间大小,可以将其设为0。
第六个参数tmAveCharWidth为字体中字符的平均宽度(通常定义为字母x的宽度)。此值不包括粗体或斜体字符所需的突出部分。对于大写字母的平均宽度则需要tmAveCharWidth的1.5倍。
第七个参数tmMaxCharWidth为字体中最宽字符的宽度。

格式化文字
如果要在视窗中显示字体,就必须首先取得字元的高度和宽度,可以在开始定义两个变量来保存平均字元的宽度和总的字元高度,如下:
cxChar = tm.tmAveCharWidth ;
cyChar = tm.tmHeight + tm.tmExternalLeading ;
可以看到在计算cyChar时包括了tmExternalLeading 栏位来确保可读性。
要显示格式化的字符串必须要使用sprintf和wsprintf函数来显示,从 sprintf 和 wsprintf 传回的值就是字串的长度。
综合使用
/*-------------------------------------
SYSMETS.H -- System metrics display structure
---------------------------------------*/
#include <tchar.h>
#include <Windows.h>
#define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))
struct
{
int index;
TCHAR * szLable;
TCHAR * szDesc;
}
sysmetrics[] = {
SM_CXSCREEN, TEXT("SM_CXSCREEN"), TEXT("Screen width in pixels"),
SM_CYSCREEN, TEXT("SM_CYSCREEN"),TEXT("Screen height in pixels"),
SM_CXVSCROLL, TEXT("SM_CXVSCROLL"), TEXT("Vertical scroll width"),
SM_CYHSCROLL, TEXT("SM_CYHSCROLL"), TEXT("Horizontal scroll height"),
SM_CYCAPTION, TEXT("SM_CYCAPTION"), TEXT("Caption bar height"),
SM_CXBORDER, TEXT("SM_CXBORDER"), TEXT("Window border width"),
SM_CYBORDER, TEXT("SM_CYBORDER"), TEXT("Window border height"),
SM_CXFIXEDFRAME, TEXT("SM_CXFIXEDFRAME"), TEXT("Dialog
Windows编程之TextOut函数详解

最低0.47元/天 解锁文章
420

被折叠的 条评论
为什么被折叠?



