QQ登录

只需一步,快速开始

399上位机VC MFC实现文字轮廓提取

[ 复制链接 ]

399上位机VC MFC实现文字轮廓提取

399上位机VC MFC实现文字轮廓提取

实现文字轮廓提取
功能展示
用PLC写字是一件很神奇的事,大家知道PLC定位控制仅支持直线插补,圆弧插补,所以知道坐标参数才是定位的前提,我们当前例程实现文字轮廓的提取,提取过程中获取轮廓直线的两点位置,映射到设置坐标中就得到了文字对应参数。例程的效果如图。点击按钮输入要提取的文字及相关信息,确认后就可每次刷新界面都会用CDC类的LINETO指令将文字轮廓画出;

要点提示
例程中文字轮廓提取是通过自定义类CTTFOutline完成,只要在主窗口中调用类函数
m_TTF.SetFontProperty(“宋体”,64,10,0); m_TTF.SetText(“工控编程吧\r\n gkbc8.com”);设置要提取的文字及文字属性,就可调用类的ShowText(&dc,50,10);显示提取的文字轮廓;

TTF字体全称TrueType?Font?,由Apple和微软公司合作推出的文字文件格式;
一个TTF字符由许多轮廓组成,每一个轮廓由一个名叫TTPOLYGONHEADER的数据结构开始,跟在TTPOLYGONHEADER后面的是一系列的TTPOLYCURVE数据结构体。轮廓的顶点是POINTFX类型的数据结构点。
TTPOLYGONHEADER的结构如下:
1 typedef struct _TTPOLYGONHEADER?{
2 DWORD cb //描述字符要求的字节数
3 DWORD dwType //指定返回的字符轮廓类型:TT_POLYGON_TYPE
4 POINTFX pfxStart //指定字符轮廓的起点
5 } TTPOLYGONHEADER, *LPTTPOLYGONHEADER
TTPOLYCURVE的结构如下:
typedef struct tagTTPOLYCURVE?{
WORD wType //指定描述字符轮廓的线类型:TT_PRIM_LINE, TT_PRIM_QSPLINE, TT_PRIM_CSPLINE
WORD cpfx //指定结构中含有POINTFX的个数
POINTFX apfx[1] //指定字体中保留的polyline和Bzier spline
} TTPOLYCURVE, *LPTTPOLYCURVE

POINTFX的结构如下:
typedef struct tagPOINTFX {
FIXED x //x-component of a point on the outline of a TrueType character
FIXED y //y-component of a point on the outline of a TrueType character
} POINTFX, *LPPOINTFX
对文字轮廓的获取通过API函数GetGlyphOutline()进行获取,在进行绘制。
在TTF字体结构中描述了TTF字体数据组成,在这里通过GLYPHMETRICS来了解一下TTF字体结构。更具体详细情况参 考MSDN。
GLYPHMETRICS的结构如下:
typedef struct _GLYPHMETRICS {
UINT gmBlackBoxX //指定完全包围字体结构的最小矩阵的宽度?
UINT gmBlackBoxY //指定完全包围字体结构的最小矩阵的高度
POINT gmptGlyphOrigin //指定完全包围字体结构的最小矩阵左上角的点坐标
short gmCellIncX //指定当前的起点到下一个字符的起点的水平距离
short gmCellIncY //...垂直距离
} GLYPHMETRICS, *LPGLYPHMETRICS
结构GLYPHMETRICS的使用主要在API函数GetGlyphOutline()来保存字符单元在字形的位置。
TrueType字体中的字符轮廓由直线和二次贝塞尔曲线片段所构成。Windows系统提供了API函数GetGlyphOutline()来获取字符的轮廓。函数通过字符Code确定一个字符在TTF字库中的结构,并取出字符Code所对应的数据。下面简单说明下函数的结构
GetGlyphOutline()函数结构:
DWORD GetGlyphOutline(UINT nChar, //需要获取字符
UINT nFormat, //获取字符的格式
LPGLYPHMETRICS lpgm,//获取字符的相关信息
DWORD cbBuffer, //保存字符数据缓冲区的大小
LPVOID lpBuffer, //保存字符数据的缓冲区
const MAT2* lpmat2 //变换矩阵
)const
实现功能
1.新建基于对话框的应用程序
2.复制例程根目录类文件TTFOutline.cpp,TTFOutline.h,并加载到工程中,在主对话框包含头文件#include "TTFOutline.h"添加类的实例CTTFOutline m_TTF;
3.添加按钮<设置 文字>关联点击函数,调用m_TTF的成员函数,并在OnPaint()函数中也调用其显示用的函数
void CGkbc8Dlg::OnButton1()
{
/*  CFontSetDlgDlg;
  if(IDOK ==Dlg.DoModal() )
  {
  m_TTF.SetFontProperty(Dlg.GetFontFaceName(),Dlg.GetFontHeight(),Dlg.GetFontSpace(),Dlg.GetFontWidth());
  m_TTF.SetText(Dlg.GetText());
  Invalidate();
  }*/
  m_TTF.SetFontProperty("宋体",64,10,0);
  m_TTF.SetText("工控编程吧\r\n gkbc8.com");
  Invalidate();  
}
CPaintDC dc(this);
m_TTF.ShowText(&dc,50,10);
4.文字的更多设置功能,也可以复制例程中类来设置;


我们来演示下功能实现的整个过程1.新建基于对话框的应用程序
2.复制例程根目录类文件TTFOutline.cpp,TTFOutline.h,并加载到工程中,在主对话框包含头文件#include "TTFOutline.h"添加类的实例CTTFOutline m_TTF;
3.添加按钮<设置 文字>关联点击函数,调用m_TTF的成员函数,并在OnPaint()函数中也调用其显示用的函数
void CGkbc8Dlg::OnButton1()
{
/*  CFontSetDlgDlg;
  if(IDOK ==Dlg.DoModal() )
  {
  m_TTF.SetFontProperty(Dlg.GetFontFaceName(),Dlg.GetFontHeight(),Dlg.GetFontSpace(),Dlg.GetFontWidth());
  m_TTF.SetText(Dlg.GetText());
  Invalidate();
  }*/
  m_TTF.SetFontProperty("宋体",64,10,0);
  m_TTF.SetText("工控编程吧\r\n gkbc8.com");
  Invalidate();  
}
CPaintDC dc(this);
m_TTF.ShowText(&dc,50,10);
4.文字的更多设置功能,也可以复制例程中类来设置;

我们来演示下功能实现的整个过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:399.上位机VC MFC实现文字轮廓提取.zip 
文件大小:144.07 KB  售价:29金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索