MFC——文本字体操作

MFC——文本字体操作

一、简述

  • 本博文记录 MFC 框架处理文本字体的学习笔记。

1、准备步骤

  • 用 Visual Studio(本人的是 Visual Studio 2017)新建一个 MFC 应用项目,配置为单文本视图,样式和主题由个人爱好,应用后缀选择以“view”结尾,默认是App。
  • 接着用 资源视图展开项目的资源,并且用可视化菜单编辑器打开“菜单”视图,添加菜单及其相关菜单项,如下图所示:
    在这里插入图片描述
  • 并设置好相关菜单项的 ID。

2、简单示例

  • 展开“解决方案资源管理器”并且打开形式如“项目名称view.cpp"的源文件,找到 OnDraw函数体,编辑如下代码:
    void CFontEffectsSampleView::OnDraw(CDC* pDC)
    	{
    		CFontEffectsSampleDoc* pDoc = GetDocument();
    		ASSERT_VALID(pDoc);
    		if (!pDoc)
    			return;
    	
    		// TODO: 在此处为本机数据添加绘制代码
    		AfxGetMainWnd()->SetWindowText("字体效果测试程序");
    		CRect rc;
    		GetClientRect(&rc);
    		TEXTMETRIC tm;
    		pDC->GetTextMetrics(&tm);
    		pDC->SetTextAlign(TA_CENTER | TA_TOP);
    		CString strText;
    		strText.Format("字体高度=%d  字体宽度=%d  斜体=%d  下划线=%d 删除线=%d"
    			, tm.tmHeight, tm.tmWeight, tm.tmItalic, tm.tmUnderlined, tm.tmStruckOut);
    		pDC->TextOut((rc.left + rc.right) / 2, 0, strText);
    	}
    
  • 效果如下图:
    在这里插入图片描述

二、字体效果

1、空心字体效果

  • 在 Visual Studio 编辑器中使用快捷键“Ctrl+Shift+X”代开如下图类向导,并且将将类名改为“**view”的类:
    在这里插入图片描述
  • 找到之前编辑好的菜单项“设计空心字体”的ID,点击然后在消息框选择“command"消息,在点击”添加消息处理函数“按钮,在点击”编辑代码“,编辑如下代码:
    void CFontEffectsSampleView::OnMenuKongxinFont()
    {
    	// TODO: 在此添加命令处理程序代码
    	CClientDC dc(this);		//获得当前对话框的客户区设备上下文句柄
    	LOGFONT lf;	//更改当前字体
    	dc.GetCurrentFont()->GetLogFont(&lf);
    	CFont font;	//保存设备上下文最初使用的字体对象
    	lf.lfCharSet = 134;
    	lf.lfHeight = -80;
    	lf.lfWidth = 0;
    	strcpy_s(lf.lfFaceName, "华文行楷");		
    	font.CreateFontIndirect(&lf);		//创建字体
    	CFont *pOldFont = dc.SelectObject(&font);	//装载字体
    	dc.SetBkMode(TRANSPARENT);	//设置当前字体的模式为透明
    	CPen pen(PS_SOLID, 2, RGB(255, 50, 0));	//更改当前画笔
    	CPen *pOldPen = dc.SelectObject(&pen);	//装载画笔
    	dc.BeginPath();		//开始绘制
    	dc.TextOutA(10, 10, "这里是空心字体效果示例");	//第一二个参数为文本输出位置x y
    	dc.EndPath();		//结束绘制
    	dc.StrokePath();
    	dc.SelectObject(pOldFont);		//回复设备上下文的原有设置
    	dc.SelectObject(pOldPen);			//回复画笔
    }
    
  • 效果如下图:
    在这里插入图片描述

2、渐变字体效果

  • 步骤和上面类似,只不过编辑的是菜单项“渐变颜色的字体”的实现代码,代码如下:
    void CFontEffectsSampleView::OnMenuitemJianbianFont()	//渐变颜色字体的实现
    {
    	// TODO: 在此添加命令处理程序代码
    	CClientDC dc(this);
    	LOGFONT lf;
    	dc.GetCurrentFont()->GetLogFont(&lf);
    	CFont font, *pOldFont;
    	lf.lfCharSet = 134;
    	lf.lfHeight = -50;
    	lf.lfWidth = 0;
    	strcpy_s(lf.lfFaceName, "华文行书");
    	font.CreateFontIndirect(&lf);
    	pOldFont = dc.SelectObject(&font);
    	dc.SetBkMode(HTTRANSPARENT);
    	CPen pen(PS_NULL, 1, RGB(0, 0, 255));
    	CPen *pOldPen = dc.SelectObject(&pen);
    	CBrush br, *pOldBrush;
    	pOldBrush = dc.SelectObject(&br);
    	dc.BeginPath();
    	dc.TextOut(10, 70, "这里是渐变颜色字体示例");
    	dc.EndPath();
    	dc.SelectClipPath(RGN_COPY);
    	for (int i = 255; i > 0; i--)
    	{
    		int iRadius = (600 * i) / 255;
    		dc.SelectObject(pOldBrush);
    		br.DeleteObject();
    		br.CreateSolidBrush(RGB(i, i, i));
    		dc.SelectObject(&br);
    		dc.Ellipse(-iRadius, -iRadius / 3, iRadius, iRadius / 3);
    	}
    	dc.SelectObject(pOldFont);
    	dc.SelectObject(pOldPen);
    	dc.SelectObject(pOldBrush);
    }
    
  • 效果如下图:
    在这里插入图片描述

3、旋转字体

  • 旋转字体的实现代码如下:
    //旋转字体实现
    void CFontEffectsSampleView::OnMenuitemRotateFont()
    {
    	// TODO: 在此添加命令处理程序代码
    	CClientDC dc(this);
    	LOGFONT lf;
    	lf.lfHeight = 50;
    	lf.lfWidth = 0;
    	lf.lfEscapement = 500;		// 倾斜30°,十分之一度为单位
    	lf.lfOrientation = 0;
    	lf.lfItalic = false;
    	lf.lfUnderline = false;
    	lf.lfStrikeOut = false;
    	lf.lfCharSet = GB2312_CHARSET;
    	strcpy_s(lf.lfFaceName, "行书");
    	CFont font;
    	font.CreateFontIndirect(&lf);
    	CFont *pOldFont = dc.SelectObject(&font);
    	dc.SetBkMode(TRANSPARENT);
    	dc.SetTextColor(RGB(0, 255, 0));
    	dc.TextOut(10, 360, "旋转字体示例");
    	dc.SelectObject(pOldFont);
    }
    

4、3D字体

  • 3D 字体示例代码如下:
    void CFontEffectsSampleView::OnMenuitem3dFont()
    {
    	// TODO: 在此添加命令处理程序代码
    	CClientDC dc(this);
    	LOGFONT lf;
    	lf.lfHeight = 50;
    	lf.lfWidth = 0;
    	lf.lfEscapement = 0;
    	lf.lfOrientation = 0;
    	lf.lfWeight = FW_HEAVY;
    	lf.lfItalic = false;
    	lf.lfUnderline = false;
    	lf.lfStrikeOut = false;
    	lf.lfCharSet = GB2312_CHARSET;
    	strcpy_s(lf.lfFaceName, "隶书");
    	CFont font;
    	font.CreateFontIndirect(&lf);
    	CFont *pOldFont = dc.SelectObject(&font);
    	dc.SetBkMode(TRANSPARENT);
    	dc.SetTextColor(::GetSysColor(COLOR_3DDKSHADOW));
    	CString text = "这里是3D字体示例";
    	CRect rc;
    	GetClientRect(&rc);
    	dc.BeginPath();
    	//绘制内容
    	dc.DrawText(text, rc, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CENTER);
    	dc.SetTextColor(::GetSysColor(COLOR_3DHILIGHT));	//设置文本颜色
    	//绘制阴影文本内容
    	dc.DrawText(text, rc + CPoint(2, 2), DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CENTER);
    	dc.EndPath();
    	dc.StrokePath();
    	dc.SelectObject(pOldFont);
    }
    

5、效果展示

  • 上述示例的效果如下图:
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御承扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值