Windows的字體LOGFONT


LOGFONTWindows內部字體的邏輯結構,主要用於設置字體格式,其定義如下:

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中字體重量表示字體的粗細程度,其范圍在01000之間,正常為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/>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM