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表示字样名称。

MFC字体的更多相关文章

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

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

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

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

  3. 【转】MFC 字体LOGFONT

    Windows的字体LOGFONT LOGFONT是Windows内部字体的逻辑结构,主要用于设置字体格式,其定义如下:typedef struct tagLOGFONTA{    LONG      ...

  4. MFC字体与文本输出

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

  5. MFC 字体

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

  6. CATALOGUE 目录

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

  7.  Link 

    GNU/Linux, Bash, C, PHP, Perl, JavaScript, Vim, Git http://blog.sanctum.geek.nz/about   中文數學詞典 http: ...

  8. MFC 修改各种控件的背景颜色、字颜色和字体

    今天主要总结一下有关MFC 中静态编辑框(StaticEdit).编辑框(Edit)和按钮(Button)的背景颜色.字颜色和字体. 我的程序运行结果如下: 由上图我们知道修改的地方有:1.把Stat ...

  9. MFC编辑框字体大小调节(转)

    在学习MFC中需要调整编辑框中的字体大小,以下是我结合网上与自己实际操作总结的,希望对其它同学有所帮助.       首先,了解以下函数原型:BOOL CreateFont( int nHeight, ...

随机推荐

  1. scala判断数据类型

    scala判断一个数据或者对象的类型只需要在该对象后面添加 .getClass.getSimpleName : scala> 222.getClass.getSimpleName res1: S ...

  2. 火狐l浏览器所有版本

    最近在群里看到好多人需要火狐浏览器的低版本,而且都是跪求,更有甚者是高额悬赏,因此给大家一个链接,免费的,免费的,免费的!!!重要的事说三遍,拿走不谢~~ 火狐所有版本,了解一下,有需要的自行下载. ...

  3. Chapter 5 Blood Type——15

    I hesitated, torn, but then the first bell sent me hurrying out the door — with a last glance confir ...

  4. Chapter 4 Invitations——14

    "Hi, Bella." “你好,Bella” "What's up?" I said as I was unlocking the door. “怎么了?” ...

  5. 深入浅出解读 Java 虚拟机的差别测试技术

    本文分享基于字节码种子生成有效.可执行的字节码文件变种,并用于 JVM 实现的差别测试.本文特别提出用于修改字节码语法的classfuzz技术和修改字节码语义的classming技术.上述变种技术系统 ...

  6. VS 2015 GIT操作使用说明

    相比VS2013,VS2015在对GIT的支持上有了更强大的支持.本篇仅作抛砖引玉,不做过多介绍: 1. 打开VS 2015起始页 2. 打开团队资源管理器 打开[本地GIT存储库]选项卡,然后点击[ ...

  7. 组合模式 合成模式 COMPOSITE 结构型 设计模式(十一)

    组合模式(合成模式 COMPOSITE) 意图 将对象组合成树形结构以表示“部分-整体”的层次结构. Composite使得用户对单个对象和组合对象的使用具有一致性.   树形结构介绍 为了便于理解, ...

  8. Windows已遇到关键问题,将在一分钟后自动重新启动,请立即保存工作

    Windows已遇到关键问题,将在一分钟后自动重新启动,请立即保存工作 1. 把电脑右下角网络断开 2.同时按 "WIN+R" 打开“运行”命令窗口 输入“cmd”命令,按回车键“ ...

  9. 《Web安全深度剖析》

    书名 <Web安全深度剖析> 图片  时间  2018-11月   总结  算是我安全的启蒙书  前五章都是工具  看完差不多算个脚本小子 后面的实战感觉很空洞没什么实战

  10. Docker 更新镜像

    docker镜像如下: 今天在运行的容器内使用 apt-get update 命令进行更新时,发下很多404错误. Err http://archive.ubuntu.com wily-updates ...