IT Course

Technology Collection: Ruijin.R.Zhao

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

系统字体概述;

设备内容还定义了在您呼叫TextOut显示文字时Windows使用的字体。内定字体为「系统字体」,或用Windows表头文件中的标识符,即SYSTEM_FONT。系统字体是Windows用来在标题列、菜单和对话框中显示字符串的内定字体。

在Windows的早期版本中,系统字体是等宽(fixed-pitch)字体,这意味着所有字符均具有同样的宽度,非常类似于打字机。然而,从Windows 3.0开始,系统字体成为一种变宽(variable-pitch)字体,这意味着不同的字符具有不同的大小,比如,「W」要比「i」宽。变宽字体比等宽字体好读,这已经是公认的事实。不过,可以想见,这一转变使很多原来的Windows程序代码不再适用,从而要求程序写作者学习一些使用字体的新技术。

系统字体是一种「点阵字体」,这意味着字符被定义为图素块(以后讨论TrueType字体,它是由轮廓定义的)。至于确切的大小,系统字体的字符大小取决于视讯显示器的大小。系统字体设计为至少能在显示器上显示25行80列文字。

字符大小:

要用TextOut显示多行文字,就必须确定字体的字符大小,可以根据字符的高度来定位字符的后续行,以及根据字符的宽度来定位字符的后续列。

系统字体的字符高度和平均宽度是多少?这个问题取决于视讯显示器的图素大小。Windows需要的最小显示大小是640×480,但是许多使用者更喜欢800×600或1024×768的显示大小。另外,对于这些较大的显示尺寸,Windows允许使用者选择不同大小的系统字体。

程序可以呼叫GetSystemMetrics函数以取使用者接口上各类视觉组件大小的信息,呼叫GetTextMetrics取得字体大小。GetTextMetrics传回设备内容中目前选取的字体信息,因此它需要设备内容句柄。Windows将文字大小的不同值复制到在WINGDI.H中定义的TEXTMETRIC型态的结构中。TEXTMETRIC结构有20个字段,我们只使用前七个:

typedef struct tagTEXTMETRIC
{
    LONG tmHeight ;                // tmHeight = tmAscent + tmDescent
    LONG tmAscent ;                //基线上部
    LONG tmDescent ;              //基线下部
    LONG tmInternalLeading ;    //字体内部间距,有重音时会自动收缩一点
    LONG tmExternalLeading ;   //横向字体行间距
    LONG tmAveCharWidth ;     //加权小写宽度
    LONG tmMaxCharWidth ;     //字体中最宽字符的宽度

           其它结构字段
}
TEXTMETRIC, * PTEXTMETRIC

这些字段值的单位取决于选定的设备内容映像方式。在内定设备内容下,映像方式是MM_TEXT,因此值的大小是以图素为单位。

要使用GetTextMetrics函数,需要先定义一个结构变量(通常称为tm):

TEXTMETRIC tm ;
在需要确定文字大小时,先取得设备内容句柄,再呼叫GetTextMetrics:
hdc = GetDC (hwnd) ;

GetTextMetrics (hdc, &tm) ;

ReleaseDC (hwnd, hdc) ;

此后,您就可以查看文字尺寸结构中的值,并有可能保存其中的一些以备将来使用。

 

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

case WM_CREATE:
hdc = GetDC (hwnd) ;
GetTextMetrics (hdc, &tm) ;
cxChar = tm.tmAveCharWidth ;
cyChar = tm.tmHeight + tm.tmExternalLeading ;
ReleaseDC (hwnd, hdc) ;
return 0 ;
输出格式化文本:
int  iLength ;
TCHAR szBuffer [40] ;
其它行程序
iLength = wsprintf (szBuffer, TEXT ("The sum of %i and %i is %i"),    //将格式化字符串放入缓冲区中
                        iA, iB, iA + iB) ;
TextOut (hdc, x, y, szBuffer, iLength) ; //输出
 
综合使用:
我们大概知道从Windows的GetSystemMetrics函数中取得的信息是很有意义的,该函数传回Windows中不同视觉组件的大小信息,如图标、光标、标题列和滚动条等。它们的大小因显示卡和驱动程序的不同而有所不同。GetSystemMetrics是在程序中完成与设备无关图形输出的重要函数。

该函数需要一个参数,叫做「索引」,在Windows表头文件定义了75个整数索引标识符(标识符的数量随着每个版本的Windows的发布而不断地增加,在Windows 1.0的程序写作者文件中仅列出了26个)。GetSystemMetrics传回一个整数,这个整数通常就是参数中指定的图形组件大小。

让我们来编写一个程序,显示一些可以从GetSystemMetrics呼叫中取得的信息,显示格式为每种视觉组件一行。如果我们建立一个表头文件,在表头文件中定义一个结构数组,此结构包含GetSystemMetrics索引对应的Windows表头文件标识符和呼叫所传回的每个值对应的字符串,这样处理起来要容易一些。表头文件名为SYSMETS.H,如程序所示。

#define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))
struct
{
    int    Index ;
    TCHAR *       szLabel ;
    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 window frame width"),
       
    SM_CYFIXEDFRAME,  TEXT ("SM_CYFIXEDFRAME"),    TEXT ("Dialog window frame height"),
       
    SM_CYVTHUMB,        TEXT ("SM_CYVTHUMB"),          TEXT ("Vertical scroll thumb height"),
       
    SM_CXHTHUMB,        TEXT ("SM_CXHTHUMB"),          TEXT ("Horizontal scroll thumb width"),
       
    SM_CXICON,            TEXT ("SM_CXICON"),                TEXT ("Icon width"),
       
    SM_CYICON,            TEXT ("SM_CYICON"),                 TEXT ("Icon height"),
       
    SM_CXCURSOR,       TEXT ("SM_CXCURSOR"),            TEXT ("Cursor width"),
       
    SM_CYCURSOR,       TEXT ("SM_CYCURSOR"),            TEXT ("Cursor height"),
       
    SM_CYMENU,           TEXT ("SM_CYMENU"),                 TEXT ("Menu bar height"),
       
    SM_CXFULLSCREEN,    TEXT ("SM_CXFULLSCREEN"),       TEXT ("Full screen client area width"),
       
    SM_CYFULLSCREEN,    TEXT ("SM_CYFULLSCREEN"),       TEXT ("Full screen client area height"),
       
    SM_CYKANJIWINDOW, TEXT ("SM_CYKANJIWINDOW"),    TEXT ("Kanji window height"),
       
    SM_MOUSEPRESENT,   TEXT ("SM_MOUSEPRESENT"),       TEXT ("Mouse present flag"),
       
    SM_CYVSCROLL,         TEXT ("SM_CYVSCROLL"),             TEXT ("Vertical scroll arrow height"),
       
    SM_CXHSCROLL,        TEXT ("SM_CXHSCROLL"),              TEXT ("Horizontal scroll arrow width"),
       
    SM_DEBUG,               TEXT ("SM_DEBUG"),                      TEXT ("Debug version flag"),
       
    SM_SWAPBUTTON,     TEXT ("SM_SWAPBUTTON"),           TEXT ("Mouse buttons swapped flag"),
       
    SM_CXMIN,                TEXT ("SM_CXMIN"),                      TEXT ("Minimum window width"),
       
    SM_CYMIN,                TEXT ("SM_CYMIN"),                       TEXT ("Minimum window height"),
       
    SM_CXSIZE,              TEXT ("SM_CXSIZE"),                     TEXT ("Min/Max/Close button width"),
       
    SM_CYSIZE,              TEXT ("SM_CYSIZE"),                      TEXT ("Min/Max/Close button height"),
       
    SM_CXSIZEFRAME,      TEXT ("SM_CXSIZEFRAME"),           TEXT ("Window sizing frame width"),
       
    SM_CYSIZEFRAME,      TEXT ("SM_CYSIZEFRAME"),            TEXT ("Window sizing frame height"),
       
    SM_CXMINTRACK,       TEXT ("SM_CXMINTRACK"),            TEXT ("Minimum window tracking width"),
       
    SM_CYMINTRACK,       TEXT ("SM_CYMINTRACK"),             TEXT ("Minimum window tracking height"),
       
    SM_CXDOUBLECLK,    TEXT ("SM_CXDOUBLECLK"),           TEXT ("Double click x tolerance"),
       
    SM_CYDOUBLECLK,    TEXT ("SM_CYDOUBLECLK"),            TEXT ("Double click y tolerance"),
       
    SM_CXICONSPACING, TEXT ("SM_CXICONSPACING"),         TEXT ("Horizontal icon spacing"),
       
    SM_CYICONSPACING,TEXT ("SM_CYICONSPACING"),         TEXT ("Vertical icon spacing"),
       
    SM_MENUDROPALIGNMENT,     TEXT ("SM_MENUDROPALIGNMENT"),   TEXT ("Left or right menu drop"),
       
    SM_PENWINDOWS,                 TEXT ("SM_PENWINDOWS"),                TEXT ("Pen extensions installed"),
       
    SM_DBCSENABLED,                TEXT ("SM_DBCSENABLED"),                TEXT ("Double-Byte Char Set enabled"),
       
    SM_CMOUSEBUTTONS,           TEXT ("SM_CMOUSEBUTTONS"),            TEXT ("Number of mouse buttons"),
       
    SM_SECURE,                         TEXT ("SM_SECURE"),                        TEXT ("Security present flag"),
       
    SM_CXEDGE,                         TEXT ("SM_CXEDGE"),                       TEXT ("3-D border width"),
       
    SM_CYEDGE,                         TEXT ("SM_CYEDGE"),                        TEXT ("3-D border height"),
       
    SM_CXMINSPACING,              TEXT ("SM_CXMINSPACING"),              TEXT ("Minimized window spacing width"),
       
    SM_CYMINSPACING,              TEXT ("SM_CYMINSPACING"),               TEXT ("Minimized window spacing height"),
       
    SM_CXSMICON,         TEXT ("SM_CXSMICON"),   TEXT ("Small icon width"),
       
    SM_CYSMICON,        TEXT ("SM_CYSMICON"),     TEXT ("Small icon height"),
       
    SM_CYSMCAPTION,       TEXT ("SM_CYSMCAPTION"),      TEXT ("Small caption height"),
       
    SM_CXSMSIZE,         TEXT ("SM_CXSMSIZE"),       TEXT ("Small caption button width"),
       
    SM_CYSMSIZE,         TEXT ("SM_CYSMSIZE"),      TEXT ("Small caption button height"),
       
    SM_CXMENUSIZE,       TEXT ("SM_CXMENUSIZE"),         TEXT ("Menu bar button width"),
       
    SM_CYMENUSIZE,       TEXT ("SM_CYMENUSIZE"),         TEXT ("Menu bar button height"),
       
    SM_ARRANGE,              TEXT ("SM_ARRANGE"),    TEXT ("How minimized windows arranged"),
       
    SM_CXMINIMIZED,      TEXT ("SM_CXMINIMIZED"),    TEXT ("Minimized window width"),
       
    SM_CYMINIMIZED,       TEXT ("SM_CYMINIMIZED"),        TEXT ("Minimized window height"),
       
    SM_CXMAXTRACK,       TEXT ("SM_CXMAXTRACK"),      TEXT ("Maximum draggable width"),
       
    SM_CYMAXTRACK,       TEXT ("SM_CYMAXTRACK"),      TEXT ("Maximum draggable height"),
       
    SM_CXMAXIMIZED,       TEXT ("SM_CXMAXIMIZED"),          TEXT ("Width of maximized window"),
       
    SM_CYMAXIMIZED,       TEXT ("SM_CYMAXIMIZED"),         TEXT ("Height of maximized window"),
       
    SM_NETWORK,          TEXT ("SM_NETWORK"),       TEXT ("Network present flag"),
       
    SM_CLEANBOOT,         TEXT ("SM_CLEANBOOT"),          TEXT ("How system was booted"),
       
    SM_CXDRAG,               TEXT ("SM_CXDRAG"),           TEXT ("Avoid drag x tolerance"),
       
    SM_CYDRAG,               TEXT ("SM_CYDRAG"),       TEXT ("Avoid drag y tolerance"),
       
    SM_SHOWSOUNDS,        TEXT ("SM_SHOWSOUNDS"),      TEXT ("Present sounds visually"),
       
    SM_CXMENUCHECK,       TEXT ("SM_CXMENUCHECK"),    TEXT ("Menu check-mark width"),
       
    SM_CYMENUCHECK,       TEXT ("SM_CYMENUCHECK"),          TEXT ("Menu check-mark height"),
       
    SM_SLOWMACHINE,       TEXT ("SM_SLOWMACHINE"),       TEXT ("Slow processor flag"),
       
    SM_MIDEASTENABLED,       TEXT ("SM_MIDEASTENABLED"),    TEXT ("Hebrew and Arabic enabled flag"),
       
    SM_MOUSEWHEELPRESENT,TEXT ("SM_MOUSEWHEELPRESENT"),    TEXT ("Mouse wheel present flag"),
       
    SM_XVIRTUALSCREEN,       TEXT ("SM_XVIRTUALSCREEN"),     TEXT ("Virtual screen x origin"),
       
    SM_YVIRTUALSCREEN,       TEXT ("SM_YVIRTUALSCREEN"),     TEXT ("Virtual screen y origin"),
       
    SM_CXVIRTUALSCREEN,      TEXT ("SM_CXVIRTUALSCREEN"),    TEXT ("Virtual screen width"),
       
    SM_CYVIRTUALSCREEN,      TEXT ("SM_CYVIRTUALSCREEN"),      TEXT ("Virtual screen height"),
       
    SM_CMONITORS,       TEXT ("SM_CMONITORS"),      TEXT ("Number of monitors"),
       
    SM_SAMEDISPLAYFORMAT,TEXT ("SM_SAMEDISPLAYFORMAT"),    TEXT ("Same color format flag")
       
} ;

WinProc Method:

 switch (message)
    {
       
   case   WM_CREATE:
       
           hdc = GetDC (hwnd) ;
          GetTextMetrics (hdc, &tm) ;    
          cxChar = tm.tmAveCharWidth ;

          //对于可变宽度字体,TEXTMETRIC结构中的tmPitchAndFamily字段的低位为1,对于固定宽度字体,该值为0
          cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
          cyChar = tm.tmHeight + tm.tmExternalLeading ;

          ReleaseDC (hwnd, hdc) ;
          return 0 ;
   
    case   WM_PAINT :
       
          hdc = BeginPaint (hwnd, &ps) ;
          for (i = 0 ; i < NUMLINES ; i++)
          {
                   TextOut   (hdc, 0, cyChar * i,    sysmetrics[i].szLabel,   lstrlen (sysmetrics[i].szLabel)) ;                    //第一列
                   TextOut   (hdc, 22 * cxCaps, cyChar * i,     sysmetrics[i].szDesc,   lstrlen (sysmetrics[i].szDesc)) ;    //第二列
        
                   SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;
        
                  TextOut (hdc, 22 * cxCaps + 40 * cxChar, cyChar * i,   szBuffer,                                                     

                                wsprintf (szBuffer, TEXT ("%5d"), GetSystemMetrics (sysmetrics[i].iIndex))) ;                   //第三列
                   SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
         }
         EndPaint (hwnd, &ps) ;
         return 0 ;

posted on 2009-02-11 13:21  tommy007  阅读(831)  评论(0)    收藏  举报