Windows程序设计--文本输出

文本输出要全部讲完那要长篇大论了,这里只简略说一下常用的几个文本输出函数。

首先,要想输出文本,你得知道几个概念。先把常用到的两个文本输出函数列出来。
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个,附一张书上的图:
Windows程序设计--文本输出_第1张图片
常用的设置如下:

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
);

这就是简单的文本输出了,当然了,输出的字还可以是其它的颜色,这就需要一些其它的知识了。

你可能感兴趣的:(windows,函数,设计,格式化)