1. 字体的创建
(1)字体创建基本用法查看:http://www.jizhuomi.com/software/239.html
(2)总结
CFont类封装了一个Windows图形设备接口(GDI)字体,并为操作字体提供了成员函数。创建字体时首先构造一个CFont对象,再通过调CreateFont、CreateFontIndirect、CreatePointFont或CreatePointFontIndirect将一个Windows字体与此CFont对象关联,然后使用此CFont对象的成员函数就可以操作字体了。
通过点数创建简单字体
CreatePointFont()
//创建字体通过指定点数和字样
CFont NewFont;
CPaintDC dc(this); //获取设备上下文
CFont *pOldFont=dc.GetCurrentFont(); //保存原来字体
NewFont.CreatePointFont(
560, //指定字体高度
"宋体"); //字体名=宋体
//输出字体
pOldFont=dc.SelectObject(&NewFont);
dc.TextOut(150,150,"你好");
dc.SelectObject(&pOldFont);//恢复原来字体
NewFont.DeleteObject(); //删除创建的字体
pOldFont->DeleteObject();
通过点数利用LOGFONT结构间接创建字体
CreatePointFontIndirect()此函数与CreateFontIndirect很相似,但区别是LOGFONT变量中lfHeight成员的单位是十分之一点而不是逻辑单位。
//创建字体
CPaintDC dc(this); //获取设备上下文
CFont NewFont;
CFont *pOldFont=dc.GetCurrentFont(); //保存原来字体
//定义字体结构
LOGFONT lf;
lf.lfHeight=560; //字体高度(旋转后的字体宽度)=560
lf.lfWidth=50; //字体宽度(旋转后的字体高度)=20
lf.lfEscapement=0; //字体显示角度=0°
lf.lfOrientation=0;//nOrientation=0
lf.lfWeight=400; //字体磅数=500
lf.lfItalic=FALSE; //非斜体
lf.lfUnderline=FALSE; //无下划线
lf.lfStrikeOut=FALSE; //无删除线
lf.lfCharSet=DEFAULT_CHARSET; //使用缺省字符集
lstrcpy(lf.lfFaceName,"宋体"); //字体名=宋体
//NewFont.CreateFontIndirect(&lf);
NewFont.CreatePointFontIndirect(&lf);
//输出字体
pOldFont=dc.SelectObject(&NewFont);
dc.TextOut(150,150,"你好");
dc.SelectObject(&pOldFont);//恢复原来字体
NewFont.DeleteObject();
pOldFont->DeleteObject();
通过特征创建字体
CreateFont()
//创建字体
CPaintDC dc(this); //获取设备上下文
CFont NewFont;
CFont *pOldFont=dc.GetCurrentFont(); //保存原来字体
NewFont.CreateFont(
56, //字体高度(旋转后的字体宽度)=56
50, //字体宽度(旋转后的字体高度)=50
0, //字体显示角度=0°
0, //nOrientation=0
400, //字体磅数=100
FALSE, //非斜体
FALSE, //无下划线
FALSE, //无删除线
DEFAULT_CHARSET, //使用缺省字符集
OUT_DEFAULT_PRECIS, //缺省输出精度
CLIP_DEFAULT_PRECIS,//缺省裁减精度
DEFAULT_QUALITY, //nQuality=缺省值
DEFAULT_PITCH, //nPitchAndFamily=缺省值
"宋体"); //字体名=宋体
//输出字体
pOldFont=dc.SelectObject(&NewFont);
dc.TextOut(150,150,"你好");
dc.SelectObject(&pOldFont);//恢复原来字体
NewFont.DeleteObject(); //删除创建的字体
pOldFont->DeleteObject();
}
通过特征利用LOGFONT结构间接创建字体
CreateFontIndirect()
//创建字体
CPaintDC dc(this); //获取设备上下文
CFont NewFont;
CFont *pOldFont=dc.GetCurrentFont(); //保存原来字体
//定义字体结构
LOGFONT lf;
lf.lfHeight=56; //字体高度(旋转后的字体宽度)=56
lf.lfWidth=50; //字体宽度(旋转后的字体高度)=20
lf.lfEscapement=0; //字体显示角度=0°
lf.lfOrientation=0;//nOrientation=0
lf.lfWeight=400; //字体磅数=500
lf.lfItalic=FALSE; //非斜体
lf.lfUnderline=FALSE; //无下划线
lf.lfStrikeOut=FALSE; //无删除线
lf.lfCharSet=DEFAULT_CHARSET; //使用缺省字符集
lstrcpy(lf.lfFaceName,"宋体"); //字体名=宋体
NewFont.CreateFontIndirect(&lf);
//输出字体
pOldFont=dc.SelectObject(&NewFont);
dc.TextOut(150,150,"你好");
dc.SelectObject(&pOldFont);//恢复原来字体
NewFont.DeleteObject();
pOldFont->DeleteObject();
(3)设置控件的字体
//创建字体的方式和上面相同
CFont *pFont=new CFont;
pFont->CreatePointFont(200,"宋体");
//获取控件句柄设置控件字体
GetDlgItem(IDC_FONT_STATIC)->SetFont(pFont);
2. 设置字体颜色和字体背景颜色
CDC类中封装了设置字体颜色和背景颜色的函数。SetTextColor()设置字体颜色。SetBkMode()设置字体背景模式有两种:透明TRANSPARENT,不透明OPAQUE。SetBkColor()设置字体背景颜色。
//获取DC
CPaintDC dc(this);
//创建字体
CFont newFont;
CFont *pOldFont;
newFont.CreatePointFont(200,"宋体");
//将字体选入DC
pOldFont=dc.SelectObject(&newFont);
//设置字体颜色和背景颜色
COLORREF oldColor=dc.SetTextColor(RGB(255,0,0));
int oldBKMode=dc.SetBkMode(OPAQUE);
COLORREF oldBKColor=dc.SetBkColor(RGB(0,0,255));
//输出文字
dc.TextOut(150,150,"画刷绿色,画笔蓝色");
//恢复字体,字体颜色,字样背景颜色
dc.SelectObject(pOldFont);
dc.SetTextColor(oldColor);
dc.SetBkMode(oldBKMode);
dc.SetBkColor(oldBKColor);
//删除新建字体
newFont.DeleteObject();
pOldFont->DeleteObject();
3. 易错难点
(1)CreateFont()与CreatePointFont()和CreateFontIndirect()与CreatePointFontIndirect()中字体高度差别。
CreatePointFont()中nPointSize的单位是十分之一点而不是逻辑单位。CreatePointFontIndirect()中LOGFONT变量中lfHeight成员的单位是十分之一点而不是逻辑单位。