# Windows字體大小????
##
* [ ] ?問題的由來
>在早期的Windows中,系統字體是一種等寬字體,所有的字符的寬度都是一樣的,就像早期的打字機那樣。但是從Windwos3.0開始,系統字體變成了變寬字體:每個字符的寬度是不一樣的,例如W要比i寬。很多相關的閱讀研究表明,用變寬字體印刷的文章比用等寬字體印刷的可讀性更強。其原理是當字符排列的更緊湊時,眼睛和大腦更容易注意到單詞而不僅僅是一個個的字符。可想而知,從等寬字體到變寬字體導致很多Windows程序不再適用,程序員們需要學習使用字體的新技術。
> 系統字體是一種“點陣字體”:每個字符串由像素點構成。在某種程度上,系統字體中字符的大小取決于顯示器的大小:字體的設計要求能夠在顯示器上起碼顯示25行80列字符。
* [ ] 字符大小
既然Windows系統字體變成了變寬字體,那么如何確定字體的高度和寬度呢,這個值是多少呢?答案是:這取決于顯示器的分辨率。在不同的系統分辨率下用戶還可以選擇不同的系統字體。程序可以通過GetTextMetrics函數來獲取當前選定的字體信息。
獲取字號時,首先要獲取設備環境句柄,然后調用GetTextMetrics:
????hdc =GetDc(hwnd);
????GetTextMetrics(hdc,&tm);
????ReleaseDc(hwnd,hdc);
這里的&tm 是一個指針,指針指向了一個結構:TEXTMETRIC,該結構有20個字段。但是我們只關心其中的前7個字段:
```
????typedef struct tagTEXTMETRIC { // tm
????????LONG tmHeight; //字符高度
????????TEXTMETRIC結構字段的圖示
????????TEXTMETRIC結構字段的圖示 \[1\]
????????LONG tmAscent; //字符上部高度(基線以上)
????????LONG tmDescent; //字符下部高度(基線以下)
????????LONG tmInternalLeading, //由tmHeight定義的字符高度的頂部空間數目
????????LONG tmExternalLeading, //夾在兩行之間的空間數目
????????LONG tmAveCharWidth, //平均字符寬度
????????LONG tmMaxCharWidth, //最寬字符的寬度
????????LONG tmWeight; //字體的粗細輕重程度
????????LONG tmOverhang, //加入某些拼接字體上的附加高度
????????LONG tmDigitizedAspectX, //字體設計所針對的設備水平方向
????????LONG tmDigitizedAspectY, //字體設計所針對的設備垂直方向
????????BCHAR tmFirstChar; //為字體定義的第一個字符
????????BCHAR tmLastChar; //為字體定義的最后一個字符
????????BCHAR tmDefaultChar; //字體中所沒有字符的替代字符
????????BCHAR tmBreakChar; //用于拆字的字符
????????BYTE tmItalic, //字體為斜體時非零
????????BYTE tmUnderlined, //字體為下劃線時非零
????????BYTE tmStruckOut, //字體被刪去時非零
????????BYTE tmPitchAndFamily, //字體間距(低4位)和族(高4位)
????????BYTE tmCharSet; //字體的字符集
????} TEXTMETRIC;??
```
在TEXTMETRIC結構中有設備環境中當前字體的各種信息。但字體的縱向尺寸僅由其中的5項決定,如圖所示:

字體寬度:TEXTMETRICS結構中有兩個字段描述了字符的寬度:tmAveCharWidth是小寫字符的加權平均寬度,tmMaxCharWidth 是字體中最寬的字符的寬度。在等寬字體中,這兩個值是一樣的。
注意:系統字體的尺寸取決于Windows運行是的顯示分辨率,有時還取決于用戶選定的系統字號。Windowsti提供了與設備無關的圖形界面,但是作為程序員需要注意:不要再程序中猜測文本的尺寸,不要使用固定值,應該通過調用GetTextMetrics函數來獲取這些信息。
通常大寫字符的平均寬度,按照tmAveCharWidth的1.5倍計算。