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、效果展示
- 上述示例的效果如下图: