windows程序设计(七)文字输出

Windows编程之TextOut函数详解

本讲中要使用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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值