今天要详细讲解一下TEXTOUT,它是显示文本最重要的GDI函数。CSDN是这样描述的:
The TextOut function writes a character string at the specified location, using the currently selected font, background color, and text color.
我们看看他的原型:
BOOL TextOut(_In_ HDC hdc,_In_ int nXStart,_In_ int nYStart,_In_ LPCTSTR lpString,_In_ int cchString
);
第一个参数就是设备环境句柄;
第二第三个参数决定了输出字符串在客户区的起始位置,注意的是该坐标为逻辑坐标,是相对于client的;
第四个参数是指向字符串的指针;
第五个参数是字符串中的字符数。
下面是简单应用:
GetClientRect(hwnd, &r);
BeginPath(hdc);
TCHAR text[ ] = "Defenestration can be hazardous";
TextOut(hdc,r.left,r.top,text, ARRAYSIZE(text));
EndPath(hdc);
SelectClipPath(hdc, RGN_AND);
FillRect(hdc, &r, GetStockObject(GRAY_BRUSH));
TextOut函数完成了文本的输出,但是输出文本的字体、大小等属性却不是由TextOut来控制的,还是需要我们之前所说的设备环境。
那接下来不得不提就是函数GetTextMetrics,该函数把程序当前的字体信息,存放到TEXTMETRIC中。
TEXTMETRIC又是什么鬼?
windows把字符尺寸的各种值复制到类型为TEXTMETRIC的结构中。这个结构体有20个字段,我们关心几个;
typedef struct tagTEXTMETRIC {
int tmHeight;
int tmAscent;
int tmDescent;
int tmInternalLeading;
int tmExternalLeading;
int tmAveCharWidth;
int tmMaxCharWidth;
...
} TEXTMETRIC;
注意tmHeight = tmAscent+tmDescent。
现在是时候看下函数GetTextMetrics了,原型如下:
BOOL GetTextMetrics(HDC hdc, LPTEXTMETRIC lptm);
hdc:设备环境句柄。
lptm:指向结构TEXTMETRIC的指针,该结构用于获得字体信息。
返回值:如果函数调用成功,返回值非零,如果函数调用失败,返回值是0。
TEXTMETRIC tm;
hdc = GetDc(hwnd);GetTextMetrics(hdc, &tm);TextOut();