tmPitchAndFamily

格式化输出

  如果要使用TextOut函数在Windows应用程序中输出多行文字,我们就必须先取得字符的宽度和高度,通常我们在窗口消息处理函数中处理WM_CREATE消息的时候调用GetTextMetrics函数来获取他们,之所以放到WM_CREATE的部分调用,是因为当系统启动后,系统字体的大小就不会发生改变,我们只需要调用一次GetTextMetrics就可以了。

具体方法如下:


case WM_CREATE:

         hdc = GetDC (hwnd);         // 取得设备描述表句柄。

         GetTextMetrics (hdc, &tm);  // 调用GetTextMetrics函数将获得的信息保存在缓冲区中。

         iLFx = tm.tmAveCharWidth;

// 获得小写字符的平均宽度,小写字母的加权平均值就是字符的平均宽度。

         iCFx = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;

// 获得大写字符的平均宽度,对于变宽字体而言,大写字符的平均宽度是iLFx乘以150%,而如果是等宽字体,那么iCFx就等于iLFx

         iFy = tm.tmHeight + tm.tmExternalLeading; // 字符高度等于字符准线上下最大纵向高度加行距。

         ReleaseDC (hwnd, hdc) ; // 释放设备描述表句柄。

         return 0;

  大家可能对上面代码中的,tm.tmPitchAndFamily & 1 ? 3 : 2,这样的写法感到疑惑,TEXTMETRICS结构的tmPitchAndFamily属性是用来判断字体是否为变宽字体的,如果是等宽字体那么它的低位就为0,如果为变宽字体那么它的低位就为1,所以通过位运算我们可以判断是否为变宽字体,如果是就进行乘以150%的操作。

  看到这里,我们已经了解了TextOut函数输出所需要的所有知识,下面我们将以一个完整的例子对它进一步的学习。

实例练习

  例子目的是要将GetSystemMetrics函数所需要的参数以及这些参数的含义和返回值,以字符串的方式并格式化后循环输出在屏幕上。

  该例程我们分为两个文件,一个是用来保存GetSystemMetrics函数所需索引的头文件,另一个则是程序的主文件,代码的详细解释见代码的注释部分。

你可能感兴趣的:(tmPitchAndFamily)