LOGFONT是Windows內部字體的邏輯結構,主要用於設置字體格式,其定義如下:
typedef struct tagLOGFONTA
{
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;
CHAR lfFaceName[LF_FACESIZE];
} LOGFONTA
其各個字段的含義如下:
lfHeight:指定邏輯單位的字符或者字符元高度。
lfWidth:指定邏輯單位的字體字符的平均寬度。
lfEscapement:指定每行文本輸出時相對於設備x軸的角度,其單位為1/10度。
lfOrientation:指定字符基線相對於設備x軸的角度,其單位為1/10度。此值在Win9X中和lfEscapement具有相同的值,而在WinNT下有時候可能不同。
lfWeight:指定字體的重量,Windows中字體重量表示字體的粗細程度,其范圍在0~1000之間,正常為400,粗體為700,若此值為空,則使用默認的字體重量。
lfItalic:此值為TRUE時,字體為斜體。
lfUnderline:此值為TRUE時,字體帶下划線。
lfStrikeOut:此值為TRUE時,字體帶刪除線。
lfCharSet:指定所使用的字符集,如GB2312_CHARSET,CHINESEBIG5_CHARSET等。
lfOutPrecision:指定輸出精度,它定義了輸出與所要求的字體高度、寬度、字符方向及字體類型等相接近的程度。
lfClipPrecision:指定剪輯精度,它定義了當字符的一部分超過剪輯區域時對字符的剪輯方式。
lfQuality:指定輸出質量,它定義了GDI在匹配邏輯字體屬性到實際的物理字體時所使用的方式。
lfPitchAndFamily:指定字體的字符間距和族。
lfFaceName:指向NULL結尾的字符串的指針,此字符串即為所使用的字體名稱,其長度不能超過32個字符,如果為空,則使用系統默認的字體。
Windows的字體
王佰營 徐麗紅
字體是文字顯示和打印的外觀形式,它包括了文字的字樣、風格和尺寸等方面的屬性。字樣是字符書寫和顯示時表現出的特定模式,例如,對於漢字通常有宋體、楷體、隸書、黑體以及魏碑林等多種字樣;字體風格主要表現為字體的粗細和是否傾斜等特點;字體尺寸是用來指定字符所占區域的大小,通常用字符高度來描述。字體尺寸可以取毫米或英寸作為單位,但為了直觀也常常采用一種稱為點的單位,一點約折合為1/72英寸。對於漢字,還常用號數來表示字體尺寸,初號字最大,以下依次為小初、小一、二號、小二等,如此類推,字體尺寸越來越小。
根據字體的構造技術,可以把字體分為三種基本的技術類型:點陣字體、矢量字體和TrueType字體。點陣字體也稱光柵字體或位圖字體,其中每個字符的原型都是以固定的位圖形式存儲在字庫中,如System,MS Serif,FixedSys,Terminal和Small Fonts等等;矢量字體也稱為筆畫字體或繪圖儀字體,則是把字符分解為一系列直線而存儲起來,如Modern,Roman和Script等等;TrueType字體有可稱為寫真字體,其字符原型是一系列直線和曲線指令的線索的集合,如Courier New, Times New Roman,Symbol和Arial等等。點陣字體依賴於特定的設備分辨率,是與設備相關的字體;矢量字體和TrueType字體都是與設備無關的,可以任意縮放。TrueType字體的生成速率較快,使用也最廣泛。
為了編程的方便,又將字體分為邏輯字體與物理字體:邏輯字體與邏輯畫筆和邏輯畫刷相似,邏輯字體是應用程序對於理想字體的一種描述方式。而實際安裝在操作系統中的和存在於設備中的字體都稱為物理字體。應用程序在使用邏輯字體繪制文字時,系統會采用一種特定的算法把一種邏輯字體映射為最匹配的物理字體。windows的字體一般放在C:\WINDOWS\Fonts,如果對WINDOWS本身默認的字體不滿意,可下載新字體安裝在C:\WINDOWS\Fonts目錄下即可。
在Windows中,邏輯字體的具體屬性由LOGFONT結構描述。LOGFONT結構定義如下:
typedef struct tagLOGFONTA
{
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; //選擇字體的間距和字體家族
CHAR lfFaceName[LF_FACESIZE]; //字體的名稱
} LOGFONTA, *PLOGFONTA, NEAR *NPLOGFONTA, FAR *LPLOGFONTA;
typedef struct tagLOGFONTW
{
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; //選擇字體的間距和字體家族
WCHAR lfFaceName[LF_FACESIZE]; //字體的名稱
} LOGFONTW, *PLOGFONTW, NEAR *NPLOGFONTW, FAR *LPLOGFONTW;
#ifdef UNICODE
typedef LOGFONTW LOGFONT;
typedef PLOGFONTW PLOGFONT;
typedef NPLOGFONTW NPLOGFONT;
typedef LPLOGFONTW LPLOGFONT;
#else
typedef LOGFONTA LOGFONT;
typedef PLOGFONTA PLOGFONT;
typedef NPLOGFONTA NPLOGFONT;
typedef LPLOGFONTA LPLOGFONT;
#endif // UNICODE
其中:
(1)、LONG lfWeight; 設置字體線條的寬度選項:
符號 數值 意義
FW_DONTCARE 0 任意值
FW_THIN 100 非常細
FW_EXTRALIGHT 200 極細
FW_ULTRALIGHT 200 超細
FW_LIGHT 300 細
FW_NORMAL 400 正常
FW_REGULAR 400 標准
FW_MEDIUM 500 中等
FW_SEMIDBOLD 600 1/2粗
FW_DEMIBOLD 600 3/4粗
FW_BOLD 700 粗
FW_EXTRABOLD 800 特粗
FW_ULTRABOLD 800 極粗
FW_BLACK 900 黑體
FW_HEAVY 900 黑體
(2)、BYTE lfCharSet; //字符集選項:
#define ANSI_CHARSET 0
#define DEFAULT_CHARSET 1
#define SYMBOL_CHARSET 2
#define SHIFTJIS_CHARSET 128
#define HANGEUL_CHARSET 129
#define HANGUL_CHARSET 129
#define GB2312_CHARSET 134
#define CHINESEBIG5_CHARSET 136
#define OEM_CHARSET 255
#define JOHAB_CHARSET 130
#define HEBREW_CHARSET 177
#define ARABIC_CHARSET 178
#define GREEK_CHARSET 161
#define TURKISH_CHARSET 162
#define VIETNAMESE_CHARSET 163
#define THAI_CHARSET 222
#define EASTEUROPE_CHARSET 238
#define RUSSIAN_CHARSET 204
(3)、BYTE lfOutPrecision; //字體的精確度選項:
#define OUT_DEFAULT_PRECIS 0
#define OUT_STRING_PRECIS 1
#define OUT_CHARACTER_PRECIS 2
#define OUT_STROKE_PRECIS 3
#define OUT_TT_PRECIS 4
#define OUT_DEVICE_PRECIS 5
#define OUT_RASTER_PRECIS 6
#define OUT_TT_ONLY_PRECIS 7
#define OUT_OUTLINE_PRECIS 8
#define OUT_SCREEN_OUTLINE_PRECIS 9
(4)、BYTE lfClipPrecision; //裁剪字符的方法選項:
#define CLIP_DEFAULT_PRECIS 0
#define CLIP_CHARACTER_PRECIS 1
#define CLIP_STROKE_PRECIS 2
#define CLIP_MASK 0xf
#define CLIP_LH_ANGLES (1<<4)
#define CLIP_TT_ALWAYS (2<<4)
#define CLIP_EMBEDDED (8<<4)
(5)、BYTE lfQuality; //字體質量選項:
#define DEFAULT_QUALITY 0
#define DRAFT_QUALITY 1
#define PROOF_QUALITY 2
#define NONANTIALIASED_QUALITY 3
#define ANTIALIASED_QUALITY 4
(6)、BYTE lfPitchAndFamily; //選擇字體的間距和字體家族
#define DEFAULT_PITCH 0 表示可缺省的間距
#define FIXED_PITCH 1 固定的間距
#define VARIABLE_PITCH 2 可變的間距
(7)、WCHAR lfFaceName[LF_FACESIZE]; //字體的名稱選擇:
" Arial "
" Bell MT "
" Californian FB "
" Elephant "
" Forte "
" Garamond "
" Heallenschweiler "
" Impact "
" Jokerman "
" Kartika "
" Latha "
" Mangal "
" Niagara Solid "
" Onyx "
" Papyrus "
" Roman "
" Synbol "
" Tunqa "
" Verdana "
" Wide Latin "
"方正舒體"
"方正姚體"
"仿宋體"
"黑體"
"華文彩雲"
"華文仿宋"
"華文琥珀"
"華文楷體"
"華文隸書"
"華文宋體"
"華文細黑"
"華文新魏"
"華文行楷"
"華文中宋"
"楷體"
"隸書"
"宋體 &新宋體"
"宋體-方正超大字符集"
"幼圓"
這僅僅是字體的名稱的一部分,更詳細的字體名稱請查自己電腦上文件夾:C:\WINDOWS\Fonts。
Windows環境下的顯示是GDI對象通過設備描述表進行的,而字體對象就是GDI對象之一。實際上,Windows下的不同字體就是通過選擇不同的邏輯字體而輸出的。如同其他的GDI對象(如畫筆、調色板)一樣,字體對象不但具有固有的字體,我們可以建立所需要的邏輯字體,然后選進設備描述表就可以了。下面以VC 6.0環境為例加以說明。在VC 6.0中字體對象對應的類就是CFont類。CFont類有兩個成員函數CreateFont和CreatePointFontIndirect,用這兩個函數都可創建邏輯字體。函數定義如下:
BOOL CreateFont( int nHeight, //字體高度.>0:字體的高度值;=0:字體采//用缺省直.<0:此值的絕對值為高度.
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 //字體名稱
);
該函數的各個參數和LOGFONT結構的對應的成員意義相同。
BOOL CreatePointFontIndirect(Const LOGFONT *lpLogFont);
用這個函數要定義一個LOGFONT結構體,用上一個函數就不用。以下為使用例程:
void CMainWindow::OnPaint ()
{
CRect rect;
GetClientRect(&rect);
CPaintDC dc (this)
dc.SetViewportOrg(rect.Width()/2,rect.Height()/2);
LONGFONT lf;
::ZeroMemory(&lf,sizeof(lf);
lf.lfHight = 160;
lf.lfWeight = WF_BOLD;
::lstrcpy(lf.lfFaceName,_T("Arial");
Cfont font;
Font. CreatePointFontIndirect(&lf);
CFont *pOldFont = dc.SelectObject(&font);
dc.Text(0,0,CString(_T("MFC HELL!")));
dc.SelectObject(pOldFont);
}
Windows C的使用例程如下:
HFONT hFont ;
LOGFONT lf ;
TCHAR szBuffer[] = _T("Windows C---SDK!");
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
lf.lfHeight = - (int) (fabs (pt.y) / 10.0 + 0.5) ;
lf.lfWidth = 0 ;
lf.lfEscapement = 0 ;
lf.lfOrientation = 0 ;
lf.lfWeight = 5;
lf.lfItalic = 0 ;
lf.lfUnderline = 0 ;
lf.lfStrikeOut = 0 ;
lf.lfCharSet = DEFAULT_CHARSET ;
lf.lfOutPrecision = 0 ;
lf.lfClipPrecision = 0 ;
lf.lfQuality = 0 ;
lf.lfPitchAndFamily = 0 ;
lstrcpy (lf.lfFaceName, _T("Arial") ;
hFont = CreateFontIndirect (&lf) ;
Se
源文檔 <http://fengqing888.blog.163.com/blog/static/330114162010316105211790/>
