MFC字体
GDI字體分3類:點陣字體(raster font)、筆畫字體(stroke font)和Truetype字體。
默認點陣字體有7種:
System???????? (用于SYSTEM_FONT)?????? ???? 無襯線??? 西方
??????????????????????????????????????????????????????????? ??? 有襯線??? gb2312
Fixedsys??????? (用于SYSTEM_FIXED_FONT) 有襯線??? gb2312
Terminal??????? (用于OEM_FIXED_FONT)????? ?有襯線??? gb2312
????????????????????????????????????????????????????????? ????? 無襯線? ??OEM/DOS
??????????????????????????????????????????????????????????? ??? 無襯線 ???韓文
Courier????????????????????????????????????????????????? ??? 有襯線??? 西方
MS Serif??????????????????????????????????????????????? ???? 有襯線??? 西方
MS Sans Serif??? (用于DEFAULT_GUI_FONT) 無襯線??? 西方
Small Fonts?????????????????????????????????????????????? ? 無襯線??? 西方
默認筆畫字體有3種:
Modern???????????????????????????????????????????????? ????? 無襯線? ??OEM/DOS
Roman???????????????????????????????????????????????? ? ????有襯線??? OEM/DOS
Script?????? ???????????????????????????????????????? ?????????有襯線??? OEM/DOS
默認TrueType字體有13種:
Courier New?????????????????? Arial
Courier New Bold??????? ??? Arial Bold
Courier New Italic????????? ? Arial Italic
Courier New Bold Italic???? Arial Bold Italic
Times New Roman??? ????? ?Symbol
Times New Roman Bold
Times New Roman Italic
Times New Roman Bold Italic
?
System本身就是粗體,還有粗斜體。
Arial是無襯線,其他12種TrueType字體都是有襯線。
在TrueType字體中可能只有Arial Unicode MS支持東方語言。比如簡體中文、繁體中文、韓文。
?
在范例代碼里面用庫存字體SYSTEM_FIXED_FONT得到的是Fixedsys。而默認的SYSTEM_FONT是System。使用OEM_FIXED_FONT得到的是Terminal。
void CMainWindow::OnPaint()
{
CPaintDC dc(this);
dc.SelectStockObject(SYSTEM_FIXED_FONT);
//dc.SelectStockObject(OEM_FIXED_FONT);
dc.GetTextFace(strTextFace);
dc.TextOut(10,10,"SYSTEM_FIXED_FONT");
//dc.TextOut(10,10,"SYSTEM_FONT");
//dc.TextOut(10,10,"OEM_FIXED_FONT");
dc.TextOut(10,30,strTextFace);
?
dc.GetTextMetrics(&tm);
//別的代碼
}
建立邏輯字體一般用CreateFont函數和CreateFontIndirect函數。這2個函數聲明如下:
| BOOL CreateFont( ????????????? int nHeight, ????????????? int nWidth, ????????????? int nEscapement, ????????????? int nOrientation, ????????????? int nWeight, ????????????? BYTE bItalic, ????????????? BYTE bUnderline, ????????????? BYTE cStrikeOut, ????????????? BYTE nCharSet, ????????????? BYTE nOutPrecision, ????????????? BYTE nClipPrecision, ????????????? BYTE nQuality, ????????????? BYTE nPitchAndFamily, ????????????? LPCTSTR lpszFacename ); | typedef struct tagLOGFONT { ?????? LONG lfHeight; ?????? LONG lfWidth; ?????? LONG lfEscapement; ?????? LONG lfOrientation; ?????? LONG lfWeight; ?????? BYTE lfItalic; ?????? BYTE lfUnderline; ?????? BYTE lfStrikeOut; ?????? BYTE lfCharSet; ?????? BYTE lfOutPrecision; ?????? BYTE lfClipPrecision; ?????? BYTE lfQuality; ?????? BYTE lfPitchAndFamily; ?????? TCHAR lfFaceName[LF_FACESIZE]; } LOGFONT, *PLOGFONT; |
| BOOL CreateFontIndirect(const LOGFONT* lpLogFont); | |
?
從以上聲明看到CreateFontIndirect函數其實是CreateFont函數的簡化。直接參數轉換成結構。下面用CreateFont函數版本來解釋需要的參數。
nHeight參數“這是以邏輯單位表示希望得到的字符高度。”有3種可能的值:
①大于0。高度被轉換為設備單位。“它和TEXTMETRIC結構的tmHeight字段值近似相等(有時會有微小的不同,那是由于四舍五入帶來的誤差)”。“它表示該高度包含內部間隔tmInternalLeading(但不包含外部間隔tmExternalLeading)”。
②等于0。“默認字符高度”、“使用合理的缺省值”。
③小于0。負數。“它大致等于TEXTMETRIC結構的tmHeight字段減去tmInternalLeading”。“當它為負數時,Windows會將其絕對值作為字體的高度。這是一個很重要的區別:如果想要某一特定字號的字體,應該先把該字號轉換成邏輯單位,然后把nHeight設定為該值的相反數,Windows就會反向查找到你想要的字號。”
下圖介紹tmHeight、tmAscent、tmInternalLeading、tmExternalLeading的含義。
上圖截圖自《Windows程序設計(第5版,珍藏版)》(美)Charles Petzold著。里面的第73頁。
tmExternalLeading并沒有在上圖中。具體可見第776頁的“17.2.5行間距和字間距”這一節。
nWidth參數“這是以邏輯單位表示希望得到的字符寬度。”
nEscapement參數表示字符串水平基線逆時針偏離角度大小。以0.1°為單位。
nOrientation參數表示單個字符水平基線逆時針偏離角度大小。以0.1°為單位。
nWeight表示寬度。大部分都是400。System本身就是黑體,所以是700。
bItalic表示是否是斜體。
bUnderline表示是否有下劃線。
bStrikeOut表示是否有刪除線。
nCharSet表示字符集。
nOutPrecision表示輸出精度。
nClipPrecision表示剪切精度。
nQuality表示字體輸出質量。
nPitchAndFamily表示是否變寬等寬字體和字形集。
lpszFacename表示字樣名稱。
轉載于:https://www.cnblogs.com/sishenzaixian/p/5072926.html
總結
- 上一篇: 收藏书签
- 下一篇: [密码学基础][每个信息安全博士生应该知