格式化文本

由于在一次Windows对话期间,系统字体的大小不会发生改变,因此在程序运行过程中,我们只需要调用一次GetTextMetrics。最好是在窗口过程中处理WM_CREATE消息时进行些调用。WM_CREATE消息是窗口过程接收的第一个消息。当在WinMain中调用CreateWindow时,Windows以一个WM_CREATE消息调用窗口过程。

假设要编写一个Windows程序,在客户区显示几行文本,这需要先获取字符宽度和高度。所以可以在窗口过程内定义两个变量来保存平均字符宽度(cxChar)和总的字符高度(cyChar):`static int cxChar,cyChar;

其中变量名的前缀c代表“count”,在这里指像素数,与x和y结合,分别指宽和高。这些变量定义为static,因为它们在窗口过程中处理其他消息(如WM_PAINT)时也应该是有效的。如果变量在函数外面定义则不需要定义为static。

下面是获取系统字体的字符宽度和高度的WM_CREATE代码:

case WM_CREATE:  hdc=GetDC(hwnd);

                           //字符处理

                                      GetTextMetrics(hdc,&tm);

                                      cxChar=tm.tmAveCharWidth;

                                      cyChar=tm.tmHeight+tm.ExternalLeading;

                      //处理结束

                                      ReleaseDC(hwnd,hdc);

                                      return 0;

注意在上面计算cyChar时包括了tmExternalLeading字段,虽然该字段在系统字体中为0,但是因为它使得文本的可读性更好,所以还是应该把它包括进去。沿着窗口向下每隔cyChar像素就会显示一行文本。

 

也许我们会发现很有必要显示格式化的数字和简单的字符串。所以可以wgetsprintf和Windows版的sprintf-wsprintf。然后可以用TextOt将串输出到显示器上。非常方便的是,从sprintf和wsprintf返回的值就是串的长度。所以可以将这个值传递给TextOut作为iLength参数。如下代码显示了wsprintf和TextOut的典型组合:

TCHAR szBuffer[40];

......

int iLength=wsprintf(szBuffer,TEXT("The sum of %i and %i is %i"),iA,iB,iA+iB);

TextOut(hdc,x,y,szBuffer,iLength);

另外对于这样简单的情况,可以将iLength的赋值与TextOut放在同一个语句中,从而无需定义iLength,如下所示:

TextOut(hdc,x,y,szBuffer,wsprintf(szBuffer,TEXT("The sum of %i and %i is %i"),iA,iB,iA+iB));

虽然风格欠佳,但是功能与前者是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值