GDI对象CFont

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成员的单位是十分之一点而不是逻辑单位。

猜你喜欢

转载自blog.csdn.net/qq_29187197/article/details/82956579