MFC字体与文本输出

字体


成员函数


1、CFont( );

构造一个CFont对象。此对象在使用之前应该先使用CreateFont、CreateFontIndirect、CreatePointFont或CreatePointFontIndirect初始化。

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

通过指定的一些特征初始化CFont对象。下面分别介绍每个参数:

nHeight:指定字体高度(逻辑单位)。有三种取值:>0,字体映射器将高度值转换为设备单位,并与可用字体的字符元高度进行匹配;=0,字体映射器使用默认的高度值;<0,字体映射器将高度值转换为设备单位,用其绝对值与可用字体的字符高度进行匹配。nHeight转换后的绝对值不应超过16384个设备单位。

nWidth:指定字体中字符的平均宽度(逻辑单位)。

nEscapement:指定偏离垂线和显示界面X轴之间的角度,以十分之一度为单位。偏离垂线是穿过一行文本中第一个字符和最后一个字符的直线。

nOrientation:指定每个字符的基线和设备X轴之间的角度,以十分之一度为单位。

nWeight:指定字体磅数(每1000点中墨点像素数)。可取0到1000之间的任意整数值。

bItalic:指定字体是否为斜体。

bUnderline:指定字体是否带有下划线。

bStrikeOut:指定字体是否带有删除线。

nCharSet:指定字体的字符集。预定义的字符集:

ANSI_CHARSET;BALTIC_CHARSET;CHINESEBIG5_CHARSET;DEFAULT_CHARSET;EASTEUROPE_CHARSET;
GB2312_CHARSET; GREEK_CHARSET;HANGUL_CHARSET; MAC_CHARSET; OEM_CHARSET;
RUSSIAN_CHARSET; SHIFTJIS_CHARSET;SYMBOL_CHARSET;
TURKISH_CHARSET。韩国Windows:JOHAB_CHARSET;中东地区Windows:HEBREW_CHARSSET,ARABIC_CHARSET;泰国Windows:THAI_CHARSET。应用程序可以使用DEFAULT_CHARSET以允许字体名和大小完全指定逻辑字体,如果指定的字体名不存在则可能会用任意字符集的字体来代替,所以为避免不可预料的结果,应谨慎使用DEFAULT_CHARSET。

nOutPrecision:指定输出精度。输出精度定义了输出与要求的字体高度、宽度、字符方向、移位和间距等的接近程度。它的取值及含义如下(只能取其一):

OUT_CHARACTER_PRECIS;未用。
OUT_DEFAULT_PRECIS:指定缺省的字体映射器状态。

OUT_DEVICE_PRECIS:在当系统里有多种字体使用同一个名字时指示字体映射器选择一种设备字体。

OUT_OUTLINE_PRCIS:在Windows NT中此值指示字体映射器从TrueType和其他基于边框的字体中选择。

OUT_RASTER_PRECIS:在当系统里有多种字体使用同一个名字时指示字体映射器选择一种光栅字体。

OUT_STRING_PRECIS:此值没有被字体映射器使用,但是当列举光栅字体时它会被返回。

OUT_STROKE_PRECIS:没有被字体映射器使用,但是当列举TrueType字体、其他基于边框的字体和向量字体时它会被返回。

OUT_TT_ONLY_PRECIS:指示字体映射器仅从TrueType字体中选择,如果系统中没有安装TrueType字体,则字体映射返回缺省状态。

OUT_TT_PRECIS:在当系统里有多种同名的字体时指示字体映射器选择一种TrueType字体。当操作系统含有多种与指定名字同名的字体时,应用程序可以使用OUT_DEVICE_PRECIS,OUT_RASTER_PRECIS和OUT_TT_PRECIS值来控制字体映射器如何选择一种字体,例如,如果操作系统含有名字Symbol的光栅和TrueType两种字体,指定OUT_TT_PRECIS使字体映射器选择TrueType方式(指定OUT_TT_ONLY_PRECIS强制字体映射器选择一种TrueType字体,尽管这会给TrueType字体换一个名字)。

nClipPrecision:指定裁剪精度。裁剪精度定义了怎样裁剪部分超出裁剪区域的字符。它的取值及含义如下(可取一个或多个值):

CLIP_DEFAULT_PRECIS:指定缺省裁剪状态。
CLIP_CHARACTER_PRECIS:未用。

CLIP_STROKE_PRECIS:未被字体映射器使用,但是当列举光栅字体、向量字体或TrueType字体时它会被返回。在Windows环境下,为保证兼容性,当列举字体时这个值总被返回。

CLIP_MASK:未用。
CLIP_EMBEDDED:要使用嵌入式只读字体必须使用此标志。

CLIP_LH_ANGLES:当此值被使用时,所有字体的旋转依赖于坐标系统的定位是朝左的还是朝右的。如果未使用此值,设备字体总是逆时针方向旋转,但其他字体的旋转依赖于坐标系统的定向。

CLIP_TT_ALWAYS:未用。

nQuality:指定字体的输出质量。输出质量定义了GDI将逻辑字体属性匹配到实际物理字体的细致程度。它的各个取值及含义如下(取其一):

DEFAULT_QUALITY:字体的外观不重要。

DRAFT_QUALITY:字体外观的重要性次于使用PROOF_QUALITY时,对GDI光栅字体,缩放比例是活动的,这意味着多种字体大小可供选择,但质量可能不高,如果有必要,粗体、斜体、下划线、strikeout字体可被综合起来使用。

PROOF_QUALITY:字符质量比精确匹配逻辑字体字体属性更重要。对GDI扫描字体,缩放比例是活动的,并选择最接近的大小。尽管当使用PROOF_QUALITY时,选择字体大小并不完全匹配,但字体的质量很高,并没有外观上的变形。如果有必要,粗体、斜体、下划线、strikeout字体可被综合起来使用。

nPitchAndFamily:指定字体间距和字体族。低2位用来指定字体的间距,可取下列值中的一个:DEFAULT_PITCH,FIXED_PITCH,VARIABLE_PITCH。高4位指定字体族,取值及含义如下(取其一):

FF_DECORATIVE:新奇的字体,如老式英语(Old English)。
FF_DONTCARE:不关心或不知道。

FF_MDERN:笔划宽度固定的字体,有或者无衬线。如Pica、Elite和Courier New。

FF_ROMAN:笔划宽度变动的字体,有衬线。如MS Serif。

FF_SCRIPT:设计成看上去象手写体的字体。如Script和Cursive。
FF_SWISS:笔划宽度变动的字体,无斜线。如MS
Sans Serif。

应用程序可以用运算符OR将字符间距和字体族组合起来给nPitchAndFamily赋值。

字体族描述一种字体的普通外观,当所有的精确字样都不能使用时,可用它们来指定字体。

lpszFacename:指定字体的字样名的字符串。此字符串的长度不应超过30个字符。Windows函数EnumFontFamilies可以枚举出当前所有可用字体的字样名。如果lpszFacename为NULL,则GDI使用一种与设备无关的字体。

返回值:此函数成功则返回TRUE,否则返回FALSE。

CreateFont函数初始化CFont对象后,此字体就能够被选作任何设备上下文的字体了。此函数并不会创建一个新的Windows
GDI字体,只是从GDI的物理字体中选择了一个最匹配的字体。在创建一个逻辑字体时,大部分参数可以使用默认值,但一般情况下都会给出参数nHeight和lpszFacename的指定值,如果没有给nHeight和lpszFacename参数设定取值,则创建的逻辑字体与设备相关。当使用CreateFont函数初始化一个CFont对象完成后,就能够使用CDC::SelectObject函数来为设备上下文选择字体了,并且还能够在不再使用此CFont对象时删除它。

3、BOOL CreateFontIndirect(const LOGFONT* lpLogFont);

通过一个LOGFONT结构体变量给出的特征来初始化CFont对象。参数lpLogFont是指向LOGFONT结构体变量的指针,此LOGFONT结构体变定义了逻辑字体的特征。

4、BOOL CreatePointFont(int nPointSize,LPCTSTR lpszFaceName,CDC* pDC =
NULL);

此函数提供了一种由指定字样和点数创建字体的简单方式。参数的意义如下:

nPointSize:指定字体高度,以十分之一点为单位。例如,nPointSize为120则表示是12点的字体。

lpszFacename:指定字体的字样名的字符串。此字符串的长度不应超过30个字符。Windows函数EnumFontFamilies可以枚举出当前所有可用字体的字样名。如果lpszFacename为NULL,则GDI使用一种与设备无关的字体。

pDC:指向CDC对象,用来将nPointSize指定的高度转换为逻辑单位,如果为NULL,则使用屏幕设备上下文进行转换。

5、BOOL CreatePointFontIndirect(const LOGFONT* lpLogFont,CDC* pDC =
NULL);

此函数是通过指定的字样和点数创建字体的间接方式。参数lpLogFont指向一个LOGFONT结构体变量,此LOGFONT变量定义了逻辑字体的特征,它的lfHeight成员以十分之一点为单位,而不是逻辑单位。参数pDC指向CDC对象,用来将lfHeight表示的高度转换为逻辑单位,如果为NULL,则使用屏幕设备上下文进行转换。

此函数与CreateFontIndirect很相似,但区别是LOGFONT变量中lfHeight成员的单位是十分之一点而不是逻辑单位。

6、static CFont* PASCAL FromHandle(HFONT hFont);

由Windows
GDI字体的HFONT句柄获得相应的CFont对象指针。参数hFont是一个Windows字体的HFONT句柄。成功则返回CFont对象的指针,否则返回NULL。

7、int GetLogFont(LOGFONT * pLogFont);

获取CFont对象的LOGFONT结构体的拷贝。参数pLogFont指向用来接收字体信息的LOGFONT结构体变量。成功则返回非零值,否则返回零。

文本输出过程


1 确定字体信息


创建字体:使用CFont类的成员函数。

获取字体信息:

BOOL GetTextMetrics(__in   HDC hdc,__out 
LPTEXTMETRIC lptm);

参数hdc为设备上下文的句柄;参数lptm是指向TEXTMETRIC结构体变量的指针,此结构体变量用于接收字体信息。

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

typedef
struct tagTEXTMETRIC {  

  LONG 
tmHeight;        // 字符高度  

  LONG 
tmAscent;        // 字符基线以上的高度  

  LONG 
tmDescent;       // 字符基线以下的高度  

  LONG 
tmInternalLeading; // 由tmHeight成员指定的字符高度顶部的空间  

  LONG 
tmExternalLeading; // 行间距  

  LONG 
tmAveCharWidth;  // 字符的平均宽度  

  LONG 
tmMaxCharWidth;  // 字符的最大宽度  

  LONG 
tmWeight;        // 字符的粗度  

  LONG 
tmOverhang;      // 合成字体间附加的宽度  

  LONG 
tmDigitizedAspectX; // 为输出设备设计的x轴尺寸  

  LONG 
tmDigitizedAspectY; // 为输出设备设计的y轴尺寸  

  TCHAR
tmFirstChar;     // 字体中第一个字符值  

  TCHAR
tmLastChar;      // 字体中最后一个字符值  

  TCHAR
tmDefaultChar;   // 替换字体中没有的字符  

  TCHAR
tmBreakChar;     // 作为分隔符的字符  

  BYTE 
tmItalic;        // 非0则表示字体为斜体  

  BYTE 
tmUnderlined;    // 非0则表示字体有下划线  

  BYTE 
tmStruckOut;     // 非0则表示字符带有删除线  

  BYTE 
tmPitchAndFamily;// 字体间距和字体族  

  BYTE 
tmCharSet;       // 字符集  

} TEXTMETRIC, *PTEXTMETRIC;

2 格式化文本


格式化文本一般包括两种,一种是确定文本行中后续文本的位置,另一种是确定换行时下一行文本的位置。

2.1 确定后续文本的位置

先获取当前字符串的宽度,根据此宽度确定文本行中后续文本的位置。

已知本字符串的起始水平坐标和宽度,两者相加即是后续文本的起始坐标。

BOOL GetTextExtentPoint32(__in   HDC hdc,__in  
LPCTSTR lpString,__in   int c,__out  LPSIZE
lpSize);

参数hdc为设备上下文的句柄;参数lpString为指向文本字符串缓存的指针,此字符串不是必须以结束符结尾的,因为参数c指定了长度;参数c为lpString指向的字符串的长度;参数lpSize为指向SIZE结构体变量的指针,此SIZE结构体变量用于接收字符串的宽度和高度信息。

?





1

2

3

4

typedef
struct tagSIZE {  

  LONG
cx;   // 宽度  

  LONG
cy;   // 高度  

} SIZE, *PSIZE;

2.2 确定换行时下一行文本的位置

GetTextMetrics函数获取了当前字体的信息并存入TEXTMETRIC结构体后,通过计算当前文本行的垂直坐标、当前字体的高度和行间距之和,就可以得到换行时下一行的垂直坐标。

3 执行输出操作


可以通过API函数TextOut执行文本输出操作。

BOOL TextOut(__in  HDC hdc,__in  int nXStart,__in 
int nYStart,__in  LPCTSTR lpString,__in  int cbString);

参数hdc为设备上下文的句柄;参数nXStart为起始点x坐标;参数nYStart为起始点y坐标;参数lpString为要输出的文本字符串;参数cbString为字符串中要输出的字符的数量。

也可以使用设备上下文类CDC的成员函数TextOut来输出,CDC::TextOut函数的两种重载形式如下:

virtual BOOL TextOut(int x,int y,LPCTSTR lpszString,int
nCount);

BOOL TextOut(int x,int y,const CString& str);

参数x指定文本起始点的x坐标;参数y指定文本起始点的y坐标;参数lpszString为要输出的文本字符串;参数nCount指定字符串中的字节个数;参数str为包含要输出的字符的CString对象。


MFC字体与文本输出,布布扣,bubuko.com

时间: 2024-10-11 02:16:07

MFC字体与文本输出的相关文章

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

字体和文本输出:文本输出 本节主要讲解文本输出的方法和实例. 文本输出过程 在文本输出到设备以前,我们需要确定字体.字体颜色和输出的文本内容等信息.Windows窗口的客户区由应用程序管理,所以我们还要在应用程序中控制输出文本的格式,例如后续字符的位置.换行等格式. 由此,文本的输出过程大致包括确定字体信息.格式化文本和执行输出操作三个步骤.下面分别讲解. 1.确定字体信息 文本在输出以前应该先确定字体信息,或者是当前正在使用的字体,或者是自定义的字体,之后就可以根据确定的字体来显示文本或者利用

第17章 文本和字体_17.1-17.2 简单文本输出、 字体的背景知识

17.1 简单文本输出 17.1.1 文本输出函数 (1)TextOut(hdc,xStart,yStart,pString,iCount) ①xStart和yStart使用的是逻辑坐标,TextOut并不以NULL来做字符串的结束,需指定字符的个数iCount的值 ②SetTextAlign会改变xStart和yStart的含义 SetTextAlign 坐标值的含义 TA_LEFT xStart:第一个字符的左侧坐标 TA_RIGHT xStart:最后一个字符的右侧坐标 TA_CENTER

文本输出方法与字体的设置

学习目的 掌握获取字体句柄的两种方法;调用CreateFont函数创建自定义字体; 调用SetTextColor和SetBkColor函数设置字体的颜色和背景色; 掌握文本输出的过程(获取字体信息, 格式化文本, 输出文本). ? 1. 掌握获取字体句柄的方法: HFONT hF; //定义字体句柄变量hF hF=GetStockObject(); //获得系统字体句柄 SelectObject(hdc,hF); //将字体选入设备环境 ? 2. CreateFont函数创建自定义字体 HFon

Direct3D 10学习笔记(三)——文本输出

本篇将简单整理Direct3D 10的文本输出的实现,具体内容参照< Introduction to 3D Game Programming with DirectX 10>(中文版有汤毅翻译的电子书<DirectX 10 3D游戏编程入门>). 1.填充D3DX10_FONT_DESC结构体 D3DX库提供了用于显示文本的ID3DX10Font接口.而要获取一个指向ID3DX10Font对象的指针,需要先填充一个D3DX10_FONT_DESC结构体,该结构体用于描述所创建的字体

05使用CSS设置字体和文本样式

使用CSS设置字体和文本样式: 1.定义字体类型font-family 用法: font-family:name; font-family:ncursive|fantasy|monospace|serif|sans-serif name表示字体名称,可指定多种字体,用空格隔开.按优先顺序排列.如果字体名称包含空格,则应该使用括号()括起来. font是一个复合属性,所谓复合属性是指该属性能够设置多种字体属性,用法如下: font:font-style||font-variant||font-we

cocosstdio之字体之文本和FNT字体

FNT字体和文本字体的作用是:导入字体资源可以使用字体资源便可以使用其资源内的字体来在程序中使用 不同的是FNT字体资源内容比较少,所以个人猜想可以在特定情况下使用: 两种字体资源对比: 赋值过程对比:

《写给大家看的CSS书》第三章:字体与文本

一.字体与文本 字体与文本的区别: 字体主要涉及文字的大小和外观(可应用于单个字符). 文本主要涉及对字体的处理(只能应用于文本块) 二.指定字体 CSS中指定字体的最简单方式,就是使用五种通用的字体集合 serif :该字体在字符笔画末端有叫做衬线的小细节(Time New Roman.Georgia.Palatino) sans-serif:末端无任何细节(Trebuchet MS.Arial.Verdana) monospace:每个字母宽度相等(例如,i与m具有相同的宽度),通常用于排版

汇编语言使用转义字符实现简单的“全屏”文本输出

这是一个运行在Linux下的.简单的汇编程序,使用NASM 2.11,展示了使用转义字符实现简单的“全屏”文本输出 ; 可执行文件名 : eatterm ; 版本 : 1.0 ; 创建日期 : 7/10/2016 ; 最后更新日期 : 7/10/2016 ; 作者 : Moonlight Poet ; 描述 : 一个运行在Linux下的.简单的汇编程序,使用NASM 2.11, ; 展示了使用转义字符实现简单的“全屏”文本输出 ; ; 使用以下命令生成: ; nams -f elf -g -F

微信小程序之文本输出

和轮播图相似首先建立一个wtml <view class=''> <text>文本输出:</text> <block wx:for="{{custom_data}}" wx:key="*this"> <text>{{item.notification}}</text> </block> </view> 接下来是js, wx.request({ // 获取后台输入的文本 u