该类封装一个Windows的图形设备接口(GDI)字体并且提供了操纵字体的成员函数,要想使用CFont对象,首先构造一个CFont对象,然后使用成员函数CreateFont、CreateFontIndirect、CreatePointFont或CreatePointFontIndirect把该对象与Windows字体相连,这样用户便可以使用该对象所成员函数操纵字体。
1构造CFont类对象
该类只有一个构造函数,即CFont();
该函数构造一个CFont对象。该对象在使用之前必须使用成员函数CreateFont、CreateFontIndirect、CreatePointFont或CreatePointFontIndirect进行初始化,以便确定字体对象的参数。
2创建CFont类对象
调用CreateFont函来选择一种字体时,需要的很多参数,该成员函数的原型声明如下:
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);
下面对其参数分别加以介绍:
参数nHeight:定义单位度量的字体高度。
参数nWidth定义逻辑单位度量的字体的平均宽度。
参数nEscapement:定义字体标注行的逆时针方向的旋转角度(以1/10度为单位),正常情况(即水平进行标注时)的角度为0。当标注行逆进针旋转时,字体也旋转同样的角度。
参数nOrientatio:定义了角度(以1/10度为单位),该角度是一个字符的基线与X轴的夹角。当Y坐标值是向下为增加时,计算从X轴开始逆时针方向的角度,反之,当Y坐标值是向上增加时,计算从X轴开始顺序时针方向的角度。
参数nWeight:定义了字体的浓度即字体的粗细程度(像素数/1000)。下表列出了该参数的通用常量的值。
常量 | 值 | 常量 | 值 |
FW_DONTCARE | 0 | FW_SEMIBOLD | 600 |
FW_THIN | 100 | FW_DEMIBOLD | 600 |
FW_EXTRALIGHT | 200 | FW_BOLD | 700 |
FW_ULTRALIGHT | 200 | FW_EXTRABOLD | 800 |
FW_LIGHT | 300 | FW_ULTRABOLD | 800 |
FW_NORMAL | 400 | FW_BLACK | 900 |
FW_REGUNAL | 400 | FW_HEAVY | 900 |
FW_MEDIUM | 500 |
参数bItalic:确定字体是否为斜体。
参数bUnderline:确定字体是否加下划线。
参数cStrikeOut:确定字体是否被穿透(字符中央有一条横线)
参数cCharSet:指出了字体的字体集。
常量 | 值 |
ANSI_CHARSET | 0 |
DEFAULT_CHARSET | 1 |
SYMBOL_CHARSET | 2 |
SHIFTJIS_CHARSET | 128 |
OEM_CHARSET | 255 |
参数nOutputPrecision指出了所要求的输出精度,该精度确定了输出与所要求的字体高度、宽度、控制、字符方位及间距的匹配和接近程度。一般取下列值 之一OUT_CHARACTER_PRECIS、OUT_DEFAULT_PRECIS、OUT_DEVICE_PRECIS、OUT_RASTER_PRECIS、OUT_STRING_PRECIS、OUT_STROKE_PRECIS和OUT_TT_PRECIS。
参数nClipPrecision:指定了所要求的裁剪精度,当对图像的一个区域进行裁剪时,字体可能正好在裁剪线上。该参数说明怎样裁剪位于裁剪区之外的部分字体。
参数nQuality:指出了输出字体的质量.
参数nPitchAndFamily:确定了字体的间距和所属的族。这个8位参数的低4位确定了字体的间距,他们可以是DEFAULT_PITCH、FIXED_PITCH或VARIABLE_PITCH。高4位指定了字体族。
参数lpszFacename:是一个指向ASZIIZ字符串的指针,该字符串确定了目标字体的字型名。该参数的值一定不能超过30个字符,这个名称可由用户自行定义。
当调用CreateFontIndirect函数时,必须使用LOGFONT结构来构造CFont对象来绘制字体,该结构定义如下:
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;
该结构各成员变量的值与前面介绍的CreateFont函数的参数基本相同。
void CMyFontView::OnPaint()
{
CPaintDC dc(this); // 用于绘制的设备上下文
// TODO: 在此处添加消息处理程序代码
// 不要为绘制消息而调用 CWnd::OnPaint()
//使用CreateFont创建字体;
for(int i=5;i<10;i++)
{
CFont NewFont2;
NewFont2.CreateFont(-i*5,0,100,
0,400,
FALSE,FALSE,
0,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS,
L"Arial");
CFont* pOldFont2=dc.SelectObject(&NewFont2);
dc.TextOut(0,50*i-200,L"使用函数CreateFont创建字体");
dc.SelectObject(pOldFont2);
}
}
void CMyFontView::OnPaint()
{
CPaintDC dc(this); // 用于绘制的设备上下文
// TODO: 在此处添加消息处理程序代码
// 不要为绘制消息而调用 CWnd::OnPaint()
//重新设置LOGFONT结构体,以便选择字体风格;
static LOGFONT lf;
lf.lfHeight=40;
lf.lfWidth=20;
lf.lfItalic=true;
lf.lfUnderline=true;
lf.lfStrikeOut=true;
lf.lfOrientation=0;
lf.lfWeight=800;
lf.lfEscapement=0;
lf.lfCharSet=GB2312_CHARSET;
lf.lfPitchAndFamily=FIXED_PITCH|FF_MODERN;
dc.SetTextColor((COLORREF)0x000FF0000);
CFont NewFont1;
NewFont1.CreateFontIndirect(&lf);
CFont* pOldFont1=dc.SelectObject(&NewFont1);
dc.TextOut(0,10,L"使用函数CreateFontIndirect创建字体");
dc.SelectObject(pOldFont1);
}
![](http://hi.csdn.net/attachment/201111/8/0_1320711665H8AX.gif)