今天没时间写了,找了一段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);