Windows的字体LOGFONT

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) ;

SelectObject (hdc, hFont) ;

TextOut (hdc, 10, 10, szBuffer, strlen(szBuffer));

DeleteObject (SelectObject (hdc, GetStockObject (SYSTEM_FONT))) ;

EndPaint (hwnd, &ps) ;

Break;

原文地址:http://fengqing888.blog.163.com/blog/static/330114162010316105211790/

【转】MFC 字体LOGFONT的更多相关文章

  1. MFC 字体

    dc.DrawText(_T("hello"), -1, //全部 &rect, DT_SINGLELINE| //在一行 DT_CENTER| //水平居中 DC_VCE ...

  2. VS2010/MFC字体和文本输出:文本输出

    字体和文本输出:文本输出 本节主要讲解文本输出的方法和实例. 文本输出过程 在文本输出到设备以前,我们需要确定字体.字体颜色和输出的文本内容等信息.Windows窗口的客户区由应用程序管理,所以我们还 ...

  3. MFC字体与文本输出

    字体 成员函数 1.CFont( ); 构造一个CFont对象.此对象在使用之前应该先使用CreateFont.CreateFontIndirect.CreatePointFont或CreatePoi ...

  4. MFC字体

    GDI字体分3类:点阵字体(raster font).笔画字体(stroke font)和Truetype字体. 默认点阵字体有7种: System         (用于SYSTEM_FONT)   ...

  5. MFC字体样式和颜色设置

    在编写MFC界面程序时,可能会使用不同大小或者颜色的字体,这里稍做记录. 使用方法 CFont *m_pFont;//创建新的字体 m_pFont = new CFont; m_pFont->C ...

  6. MFC绘制直方图和饼图

    转载原文: Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNorma ...

  7. CATALOGUE 目录

    1 语言基础 1.1 c/c++ [转]C/C++ 存储类型 作用域 连接类型 [转]C/C++内存划分 [转]C/C++除法实现方式及负数取模详解 [转]为什么C++编译器不能支持对模板的分离式编译 ...

  8. 在 WindowMobile 上的模拟LED 显示屏插件(转)

    源:在 WindowMobile 上的模拟LED 显示屏插件 我在给一个对话框上的控件查找翻看合适的图标时,无形中看到了一个LED显示屏的图标,这里所说的LED显示屏是指由很多LED灯密集排列组成的点 ...

  9. 《随机出题软件》&《随机分队软件》源码(Windows API)

    1 引言 1.1 编写目的: 为了对院级活动<最强大脑>提供软件支持,同时为了练习使用windows API. 1.2 项目背景: 来自计算机学院学生会信息部指派的任务,规定时间完成软件的 ...

随机推荐

  1. Python endswith() 方法

    描述 endswith() 方法用于判断字符串是否以指定后缀结尾,如果是则返回 True,否则返回 False. 语法 endswith() 方法语法: S.endswith(suffix[,star ...

  2. Mac - 使用php环境

    按下shift + Command + G  ,输入以下php(www)路径 /Library/WebServer/Documents 打开终端,输入以下命令打开环境 sudo apachectl s ...

  3. cocos2dx 3.3将坐标由父空间转化到局部空间

    设在node的父空间内有一点p,要求其转化到node局部空间后的坐标p_local,代码如下: node->getNodeToParentTransform();//in order node- ...

  4. [na][tools]tcp/udp连通性测试

    一 端口连通性测试意义 目的端可以使用nc来临时开一个端口,客户端用telnet来连接测试 测试网络端口可达性,确保给某些使用特定端口的app做链路连通性检测.使它们能够正常的运行起来. 二 测试方法 ...

  5. [学习笔记]Spring依赖注入

    依赖: 典型的企业应用程序不可能由单个对象(在spring中,也可称之bean)组成,再简单的应用也是由几个对象相互配合工作的,这一章主要介绍bean的定义以及bean之间的相互协作. 依赖注入: s ...

  6. JSP版LCX:端口转发神器 KPortTran

    最近接触内网很多,渗透过程中,由于windows和linux的差别以及运行语言环境的限制导致端口转发经常出现问题.于是自己写了个简单的JSP的端口转发脚本.仿造LCX的功能,具有正向.反向.监听三种模 ...

  7. F1 P R的理解

    F1 P R的理解 precision:查准率 recall:查全率,召回率 查准率,基于预测的结果,预测为正的样本中 由多少真正的正样本.即,真正为正的越多越好. 查全率,针对原来的正样本,有多少正 ...

  8. cocos2d-x 数据存储

    这一章中,我们从一个小小的金币数入手,讨论了数据持久化的话题.我们尽量使用引擎提供的数据存储方法,以最大可能地适应跨平台需求.这里介绍的存储方法本质上都是基于 XML 的,对于 1 MB 以下的存储规 ...

  9. 关于 \t 水平制表符 Horizontal Tab (TAB)

    今天在学learn python the hard way ex26修改的时候,有一个关于\t的问题,下面分别为代码以及输出结果: 1 poem = """ 2 \tTh ...

  10. Python中写一个乒乓球类的游戏

    最近开始学Python,感觉挺好玩的,既有脚本语言的灵活性,又有丰富的类库与面向对象的特点,开发起来很方便. 游戏的规则和乒乓球一样,如果妙蛙种子掉地上了就算输,你可以用蓝色的跷跷板弹它,使他不落到地 ...