文本输出要全部讲完那要长篇大论了,这里只简略说一下常用的几个文本输出函数。
首先,要想输出文本,你得知道几个概念。先把常用到的两个文本输出函数列出来。
1.格式化文本输出函数
int DrawText(
HDC hDC, // 设备环境句柄
LPCTSTR lpString, // 要显示的字符串
int nCount, // 字符个数
LPRECT lpRect, // 要显示的区域
UINT uFormat // 格式
);
2.字符串输出函数
BOOL TextOut(
HDC hdc, // 设备环境句柄
int nXStart, // 起始位置x
int nYStart, // 起始位置y
LPCTSTR lpString, // 要显示的字符串
int cbString // 字符个数
);
好了,函数给你了,接下来就是这么用的问题,如果只是简单的用一下,那么现在就可以结束了,但是我们还要深入了解一下。
GDI:英文全名是,Graphics Device Interface 图形设备接口
GDI是拿来绘图用的,几乎所有的GDI函数都需要用到HDC hdc(设备环境句柄)
设备环境(DC)实际上是GDI内部维护的一个数据结构。它与特定显示设备相关联。
程序在绘制前必须获取一个设备环境句柄,在获取句柄后,Windows会在内部的设备环境结构中填入默认的属性值。
当程序完成对客户区的绘制后,它必须释放设备环境句柄。
还有一个绘制信息结构:
typedef struct tagPAINTSTRUCT
{
HDC hdc; //设备环境句柄
BOOL fErase; //是否擦出无效区域背景,一般为0
RECT rcPaint; //无效矩形的边界,一般为整个客户区
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32];
} PAINTSTRUCT, *PPAINTSTRUCT;
程序只能够使用前三个字段,其他的供Windows内部使用。
一般整个参数是要传进BeginPaint函数里面的。
因为文本输出也是绘图的一种,所以它需要一个hdc
获取hdc的方法有三种:
1.
//这个函数获取的DC只能在无效区域内画图 hdc=BeginPaint(hwnd,&ps); [其他代码] EndPaint(hwnd,&ps);
2.
//这个函数获取的hdc可以在整个客户区中绘图 hdc=GetDC(hwnd); [其他代码] ReleaseDC(hwnd,hdc);
3.
//这个函数获取整个窗口的hdc,所以它可以在标题栏中绘图 hdc=GetWindowDC(hwnd); [其他代码] ReleaseDC(hwnd,hdc);
详细的各个介绍可以去查阅MSDN。
我们要输出文本,还要设置一下字体。(实际运用的时候这些都是已经封装好的,无需我们手动设置,这里只是了解一下它的原理。)
有一个字体信息结构:
typedef struct tagTEXTMETRIC {
LONG tmHeight; //字符高度
LONG tmAscent; //字符上部高度(基线以上)
LONG tmDescent; //字符下部高度(基线以下)
LONG tmInternalLeading;//内部间距
LONG tmExternalLeading;//行间距
LONG tmAveCharWidth; //平均字符宽度
LONG tmMaxCharWidth; //最宽字符的宽度
LONG tmWeight; //字体的粗细轻重程度
LONG tmOverhang; //加入某些拼接字体上的附加高度
LONG tmDigitizedAspectX;//字体设计所针对的设备水平方向
LONG tmDigitizedAspectY;//字体设计所针对的设备垂直方向
TCHAR tmFirstChar; //为字体定义的第一个字符
TCHAR tmLastChar; //为字体定义的最后一个字符
TCHAR tmDefaultChar; //字体中所没有字符的替代字符
TCHAR tmBreakChar; //用于拆字的字符
BYTE tmItalic; //字体为斜体时非零
BYTE tmUnderlined; //字体为下划线时非零
BYTE tmStruckOut; //字体被删去时非零
BYTE tmPitchAndFamily; //字体间距(低4位)和族(高4位)
BYTE tmCharSet; //字体的字符集
} TEXTMETRIC, *PTEXTMETRIC;
有很多参数,但是我们常用的就前面7个,附一张书上的图:
常用的设置如下:
TEXTMETRIC tm;
[其他代码]
GetTextMetrics (hdc, &tm) ;//获取系统的字体信息
cxChar = tm.tmAveCharWidth ;//小写字符的加权平均宽度
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;//大写字符的平均宽度一般按tmAveCharWidth1.5倍计算
//tmPitchAndFamily字段的低位决定字体是否为等宽字体,1代表变宽字体,0代表等宽字体
cyChar = tm.tmHeight + tm.tmExternalLeading ;//字符高度
一般的文本输出套用上述模板就行,如果想深入了解,可以查阅MSDN。
可以用TextOut输出格式化文本.例子如下:
int iLength=0;
TCHAR szBuffer[40];
//[其他代码] //这里的其它代码意思是,定义要写在swicth之前,否则定义会跳过,编译会出错
iLength=wsprintf(szBuffer,L"The sum of %i and %i is %i",iA,iB,iA+iB);
TextOut(hdc,x,y,szBuffer,iLength);
DrawText函数需要一个无效矩形才能输出文本
所以在这个函数之前调用GetClientRect(hwnd,&Rect);
获取无效矩形区域。这个函数通常获取整个客户区。
或者用SetRect(&rect,xleft,ytop,xright,ybottom);函数设置一个矩形区域。这个函数通常获取自定义客户区。
DrawText的最后一个参数就是格式参数,详细的查阅MSDN。
还有个设置文本的对齐方式函数
UINT SetTextAlign(
HDC hdc, // 设备环境句柄
UINT fMode // 对齐方式,具体看MSDN
);
这就是简单的文本输出了,当然了,输出的字还可以是其它的颜色,这就需要一些其它的知识了。