字体和文本输出:CFont字体类
来源:互联网 发布:淘宝店家用什么快递 编辑:程序博客网 时间:2024/05/16 12:37
GDI(Graphics Device Interface),图形设备接口,是Windows提供的一些函数和结构,用于在显示器和打印机上显示图形,MFC开发中经常会使用GDI来输出文本或图形图像。文本实际上就是一种特殊的图形,它只不过是根据事先指定的“字体”绘制出来的图形。
字体通常用来为字符集中每一个字符,如字母,数字,标点符号等,指定其形状等外表特征。窗口创建后,如果没有专门指定,一般会采用系统字体作为默认字体。我们可以使用ApI函数GetStockObject(SYSTEM_FONT)获得系统字体的句柄。
CFont类:
CFont类封装了一个Windows图形设备接口(GDI)字体,并为操作字体提供了成员函数。
为了使用CFont对象,首先构造一个CFont对象,再通过调用CreateFont、CreateFontIndirect、CreatePointFont或CreatePointFontIndirect将一个Windows字体与此CFont对象关联,然后使用此CFont对象的成员函数就可以操作字体了。
文本输出过程
在文本输出到设备以前,我们需要确定字体、字体颜色和输出的文本内容等信息。Windows窗口的客户区由应用程序管理,所以我们还要在应用程序中控制输出文本的格式,例如后续字符的位置、换行等格式。
由此,文本的输出过程大致包括确定字体信息、格式化文本和执行输出操作三个步骤。下面分别讲解。
1、确定字体信息
文本在输出以前应该先确定字体信息,或者是当前正在使用的字体,或者是自定义的字体,之后就可以根据确定的字体来显示文本或者利用字体信息来设定文本的格式了,例如,我们可以根据当前字体的字符高度来确定下一行字符在什么位置输出。
自定义字体可以通过CFont类的创建字体的几个成员函数完成。获取当前选择字体的信息可以使用API函数GetTextMetrics实现,此函数的原型如下:
BOOL GetTextMetrics(__in HDC hdc,__out LPTEXTMETRIC lptm);
参数hdc为设备上下文的句柄;参数lptm是指向TEXTMETRIC结构体变量的指针,此结构体变量用于接收字体信息。TEXTMETRIC结构体的定义如下:
- 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、格式化文本
格式化文本一般包括两种,一种是确定文本行中后续文本的位置,另一种是确定换行时下一行文本的位置。
确定后续文本的位置
一般我们可以先获取当前字符串的宽度,根据此宽度确定文本行中后续文本的位置。当前字符串的宽度可以通过API函数GetTextExtentPoint32获得。GetTextExtentPoint32函数的原型如下:
BOOL GetTextExtentPoint32(__in HDC hdc,__in LPCTSTR lpString,__in int c,__out LPSIZE lpSize);
参数hdc为设备上下文的句柄;参数lpString为指向文本字符串缓存的指针,此字符串不是必须以结束符结尾的,因为参数c指定了长度;参数c为lpString指向的字符串的长度;参数lpSize为指向SIZE结构体变量的指针,此SIZE结构体变量用于接收字符串的宽度和高度信息。SIZE结构体定义如下:
- typedef struct tagSIZE {
- LONG cx; // 宽度
- LONG cy; // 高度
- } SIZE, *PSIZE;
已知本字符串的起始水平坐标和宽度,两者相加即是后续文本的起始坐标。
确定换行时下一行文本的位置
由GetTextMetrics函数获取了当前字体的信息并存入TEXTMETRIC结构体后,通过计算当前文本行的垂直坐标、当前字体的高度和行间距之和,就可以得到换行时下一行的垂直坐标。
3、执行文本输出操作
最后,通过API函数TextOut执行文本输出操作。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对象。
- 字体和文本输出:CFont字体类
- 字体和文本输出:CFont字体类
- CFont字体类
- CFont字体
- 颜色、字体和文本
- CSS字体和文本
- 设置字体和文本样式
- CSS2字体和文本属性
- CSS-字体和文本样式
- MFC 中自定义输出字体CFont和获得系统当前默认字体CFont
- Cfont字体整理
- 字体和文本布局(Fonts and TextLayout)
- CSS学习笔记(二) 字体和文本
- CSS笔记之字体和文本属性
- 关于css的字体和文本属性
- MFC CFont字体的使用
- vc++字体类CFont详解及用法实例《转》
- VC++ GDI+编程的字体和文本绘制
- Android开发之自定义控件
- QT Creator的style sheet的几种用法(QT Creator)(StyleSheet)(样式)(QT4.7)(用法)
- java几种常见的对话框整理汇总
- QT学习之经典控件源码(如此强大)
- 用递归思想写冒泡排序
- 字体和文本输出:CFont字体类
- 排列序数
- android studio实时预览报错
- leetcode:238. Product of Array Except Self(Java)解答
- swift空间位置,大小改变的动画效果
- 浏览器兼容性问题
- 欠拟合和过拟合
- 巨蟹座 55e外表达2000度 火山活泼岩浆遍布
- PAT_Basic 1007