又一更搞脑筋问题,向高手请教。(100分)

  • 主题发起人 主题发起人 fuguobin
  • 开始时间 开始时间
F

fuguobin

Unregistered / Unconfirmed
GUEST, unregistred user!
本人编写一失量图形控件要解决如下问题:
把输入的文字(包括英文和中文)打散为失量图形。类似AUTOCAD中的打散文字。请各位高手指点一二。
 
难道说没有做过这方面的高手?
 
这个有点难。Mark 一下。
 
文字本来就是矢量的啊, 打撒还有什么意义吗?
 
俺也路过
 
to lxggc:
因为本人输出的文件格式为RS-274X,该文件格式中没有文字存贮,只能打散为失量图形后保存。
 
把文字输出成路径,然后取得路径点,对路径点连线就把文字输出成多变形了。
 
to wk_knife:
您好!能不能请您说详细些,我的E-MIAL:FGB2002@163.com.谢谢!
 
今天没时间写了,找了一段C++的代码,你看一下就知道了
pDC->BeginPath();{
pDC->TextOut(0,10,"龙",2);
pDC->TextOut(200,10,"腾",2);
pDC->TextOut(400,10,"虎",2);
pDC->TextOut(600,10,"跃",2); }
pDC->EndPath();

pDC->SelectObject(pOldFont);

//检取路径数据
int nCount=pDC->GetPath(NULL,NULL,0);
CPoint* points=new CPoint[nCount];
BYTE* bytes=new BYTE[nCount];
pDC->GetPath(points,bytes,nCount);

//对路径定义点按正弦曲线进行变换
int i;
for(i=0;i<nCount;i++)
points.y=points.y+(int)(80*sin(points.x
/300.*3.1415926)+100);

//重建一个新的路径
CPoint ptStart;
pDC->BeginPath();{
for(i=0;i<nCount;i++){
switch(bytes){
//移动当前点位置
case PT_MOVETO:
pDC->MoveTo(points);
ptStart=points;
break;
//画直线
case PT_LINETO:
pDC->LineTo(points);
break;
//画贝塞尔曲线
case PT_BEZIERTO:
pDC->PolyBezierTo(points+i,3);
i=i+2;
break;
//画贝塞尔曲线并封闭图形
case PT_BEZIERTO|PT_CLOSEFIGURE:
points[i+2]=ptStart;
pDC->PolyBezierTo(points+i,3);
i=i+2;
break;
//画直线并封闭图形
case PT_LINETO|PT_CLOSEFIGURE:
pDC->LineTo(ptStart);
break;
}
}
pDC->CloseFigure();
}
pDC->EndPath();

//绘制窗口灰色背景
CBrush* pOldBrush=(CBrush*)(pDC->SelectStockObject(GRAY_BRUSH));
pDC->Rectangle(&rect);
pDC->SelectObject(pOldBrush);

//设置裁剪路径
pDC->SetPolyFillMode(WINDING);
pDC->SelectClipPath(RGN_COPY);

//用位图填充裁剪区域
CBitmap bmp;
CBitmap* pBmpOld;
bmp.LoadBitmap(IDB_BMP);

CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
pBmpOld=dcMem.SelectObject(&bmp);

pDC->StretchBlt(0,0,rect.right,rect.bottom,
&dcMem,0,0,600,100,SRCCOPY);

dcMem.SelectObject(pBmpOld);
dcMem.DeleteDC();
bmp.DeleteObject();

下面是上面要用到的几个类型在DELPHI中定义及大致的代码
type
TPointsArray = array[0..0] of TPoint;
TTypesArray = array[0..0] of Byte;
var
CurvePts: array[0..3] of TPoint;
Points: ^TPointsArray;
Types: ^TTypesArray;
PtCount: Integer;
iCount: Integer;
FormDC: HDC;

BEGIN

BeginPath(FormDC);
////绘制代码/////////////
EndPath(FormDC);
FlattenPath(FormDC);

PtCount := GetPath(FormDC, Points^, Types^, 0);//得到路径点的个数
GetMem(Points, SizeOf(TPoint)*PtCount);
GetMem(Types, PtCount);

GetPath(FormDC, Points^, Types^, PtCount); //得到路径点数组

for iCount := 0 to PtCount-1 do
begin
//做上面C中判断节点并连线的工作.
end;
StrokePath(FormDC);
FreeMem(Points);
FreeMem(Types);
 
这段代码就是把文字变成了直线段和BEZIER曲线的组合,如果你的矢量图格式不支持BEZIER曲线,那你还得自己做一个用线段拟和BEZIER的程序,用线段拟和BEZIER的程序在我的BLOG中有:NIUWENCHAI.BLOGCHINA.COM

for(i=0;i<nCount;i++){
switch(bytes){
//移动当前点位置
case PT_MOVETO:
pDC->MoveTo(points);
ptStart=points;
break;
//画直线
case PT_LINETO:
pDC->LineTo(points);
break;
//画贝塞尔曲线
case PT_BEZIERTO:
pDC->PolyBezierTo(points+i,3);
i=i+2;
break;
//画贝塞尔曲线并封闭图形
case PT_BEZIERTO|PT_CLOSEFIGURE:
points[i+2]=ptStart;
pDC->PolyBezierTo(points+i,3);
i=i+2;
break;
//画直线并封闭图形
case PT_LINETO|PT_CLOSEFIGURE:
pDC->LineTo(ptStart);
break;
}
}
 
to wk_knife:
您好!因为本人没有学过C++所以您发的C++代码我看不太懂,等您有时间的时候能不能帮写一个DELPHI原代码的,谢谢!我的分就这么多了写好全给您了。
 
老弟,如果你要做矢量图,还是建议你大概看一下C++的语法,不要求精通,能读懂就行了,因为大多数图形学的书和很多资料(CODE)都是用C++写的,其实我的C++也不行,看到宏和摸板就犯晕,上面的代码和简单,要求就是你必须了解WINDOWS的基本图形对象和一些图形API。自己动下脑筋吧,比我给你写一个完整的要强。
 
to wk_knife:
老兄说的是,虽然我现在还看不太懂但我还是给您加上这100分。再次谢谢您!另,您有没有失量文字的资料或什么书推荐一下。
 
接受答案了.
 
袁峰写的<WINDOWS 图形编程>,网上有英文的电子版,中文的电子版估计找不来,对字还讲的比较详细!
 
上面的代码一点用都没有
 
后退
顶部