有谁可以帮我解说一下API函数的用法:PolyPolyline (0分)

  • 主题发起人 主题发起人 hooyu
  • 开始时间 开始时间
H

hooyu

Unregistered / Unconfirmed
GUEST, unregistred user!
如题:谢谢
 
晕,没人用过PlyPolyLine函数吗?有谁可以帮我解说他的参数?
 
很简单。 一条语句画多个polyline
 
第一个参数存放画这多个polyline所有用到的点坐标。<br>第二个参数存放每个polyline所对应的点数<br>第三个参数是总共有几个polyline
 
procedure Polyline(const Points: array of TPoint; StartIndex: Integer = 0; NumPts: Integer = -1);<br>Description<br>Points &nbsp;//要连接的点的数组<br>Use Polyline to connect a set of points on the canvas.<br>//连接一系列的点<br>If you specify only two points, Polyline draws a single line. <br>//如果POINTS只有两个点,则只连接这两个点<br>The Points parameter is an array of points to be connected.<br><br>StartIndex//画线开始的点<br>StartIndex identifies the first point in the array to use.<br><br>NumPts//指定多少个点有效,如果是-1则所有的点有效<br>NumPts indicates the number of points to use. <br>If NumPts is -1 (the default), PolyLine uses all the points from StartIndex to the end of the array.<br>
 
Another_eYes按你所说,是否如下:<br>参数说明:<br>BOOL PolyPolyline(<br>&nbsp; &nbsp; HDC hdc, //用于画线的设备句柄(TForm.Canvas.Handle) <br>&nbsp; &nbsp; CONST POINT *lppt, //存放画多个polyline线所有用到的点坐标。<br>&nbsp; &nbsp; CONST DWORD *lpdwPolyPoints, // 存放每个polyline所对应的点数<br>&nbsp; &nbsp; DWORD cCount // 总共有几个polyline<br>&nbsp; &nbsp;); <br>那么,我应怎么调用这个函数呢?怎么给他赋值。我根据帮助找来一个例子,请帮我解读一下:<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; PolyPolyPoints, PolyLengths: TList;<br><br>&nbsp; procedure AddPolyline(const Args: array of const);<br>&nbsp; var i: Integer;<br>&nbsp; begin<br>&nbsp; &nbsp; {将数组的值写入PolyPolyPoints}<br>&nbsp; &nbsp; for i := 0 to High(Args) do {High(Args),取Args的下标,即数组值个数}<br>&nbsp; &nbsp; &nbsp; PolyPolyPoints.Add(Pointer(Args.VInteger));<br><br>&nbsp; &nbsp; PolyLengths.Add(Pointer((High(Args) + 1) div 2));<br>&nbsp; end;<br><br>begin<br>&nbsp; PolyPolyPoints:=TList.Create;<br>&nbsp; PolyLengths:=TList.Create;<br><br>&nbsp; //AddPolyline([5,5,5,40,50,40,50,5]);<br>&nbsp; //AddPolyline([5,40,50,40,50,5]);<br>&nbsp; AddPolyline([1,1,1,100,150,100,150,1,1,1]);<br>&nbsp; PolyPolyline(Form1.Canvas.Handle,PolyPolyPoints.List^, PolyLengths.List^, PolyLengths.Count);<br>end;<br>
 
你的例子我还没看,先着看看这个<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>const<br>&nbsp; C_ARR_POINT: array[0..7, 0..1] of Integer = ((50,50),(80,50),(80,40),(90,54),(80,68),(80,58),(50,58),(50,50));<br>var<br>&nbsp; hWinDc: HDC;<br>&nbsp; ptArrPoint: array[0..7] of TPoint;<br>&nbsp; i: Integer;<br>begin<br>&nbsp; for i := Low(ptArrPoint) to High(ptArrPoint) do<br>&nbsp; begin<br>&nbsp; &nbsp; ptArrPoint.X := C_ARR_POINT[i, 0];<br>&nbsp; &nbsp; ptArrPoint.Y := C_ARR_POINT[i, 1];<br>&nbsp; end;<br>&nbsp; hWinDc := GetDC(Handle);<br>&nbsp; try<br>&nbsp; &nbsp; Polyline(hWinDc, PPointer(@ptArrPoint)^, i);<br>&nbsp; finally<br>&nbsp; &nbsp; ReleaseDC(Handle, hWinDc);<br>&nbsp; end;<br>end;<br>
 
别的不说, 这个肯定不对: PolyPolyPoints.List^<br>也许你误解了, polyline中Points是个array of TPoint, 而不是array of PPoint<br>即数组中每个元素都是一个TPoint结构(2个整数)<br>而TList.List指向的是一个array of Pointer结构, 每个元素都是一个指针(32位整型数)。
 
Another_eYes说得对,Hooyu,你的例子是不会正常运行的
 
回复:fssky<br>&nbsp; &nbsp; &nbsp; 首先谢谢你,但不知C_ARR_POINT函数有何用?<br>回复:Another_eYes<br>&nbsp; &nbsp; &nbsp;我上面的代码在DELPHI 5上运行正常,可以在窗体上绘出一个长方形。<br>PolyPolyPoints.List^是对的,也正是我不明白的地方。<br>
 
【操作系统】<br>Win9X:Yes<br>WinNT:Yes<br>【说明】<br>&nbsp; 用当前选定画笔描绘两个或多个多边形 <br>【返回值】<br>&nbsp; Long,非零表示成功,零表示失败 <br>【其它】<br>&nbsp; 这个函数几乎与PolyPolygon函数完全一致,只是多边形不会填充,也不需要封闭<br>【参数表】<br>&nbsp; hdc ------------ &nbsp;Long,要在其中绘图的设备场景<br>&nbsp; lpPoint<br>&nbsp; POINTAPI,nCount POINTAPI结构数组中的第一个POINTAPI结构<br>&nbsp; lpdwPolyPoints - &nbsp;Long,在Long值数组中的第一个条目。每个条目都包含了构成一个多边形的点数。lpPoint数组由一系列多边形构成,每个在lpdwPolyPoints数组中都有一个条目<br>&nbsp; cCount --------- &nbsp;Long,要描绘的多边形总数(就是lpdwPolyPoints数组的大小)
 
回复:fssky<br>&nbsp; &nbsp; C_ARR_POINT,原来是个数组.谢谢
 
hooyu,你的例子我仔细看了,确实是可以执行的不会出错,<br>通过PolyPolyPoints.Add(Pointer(Args.VInteger))将每个元素做为一个地址保存在<br>PolyPolyPoints.List^中,虽然每个地址指向的内容可能无效,但array of TPoint 与<br>array of Pointer在内存的结构是一样的,所以能够正常执行!<br>
 
回复:fssky<br>&nbsp; &nbsp; 虽然array of TPoint 与array of Pointer在内存的结构一样,<br>但是TPoint结构(2个整数),而TList.List指向的是一个array of Pointer结构,<br>每个元素都是一个指针(32位整型数),那他取出来的数不就是[(1),(2),(3),(4)],<br>可是实际画线时好像又是两个数一组一组取出来的,这是为何?
 
TPoint结构虽然是两个整数但在内存中还是一个接一个存放的:<br>&nbsp;+---------+<br>&nbsp;+ &nbsp; X &nbsp; &nbsp; + /<br>&nbsp;+---------+ - TPoint <br>&nbsp;+ &nbsp; Y &nbsp; &nbsp; + /<br>&nbsp;+---------+<br><br>array of TPoint 就是动态个这样的结构存在:<br>&nbsp;+---------+<br>&nbsp;+ &nbsp; X &nbsp; &nbsp; + /<br>&nbsp;+---------+ - TPoint1 <br>&nbsp;+ &nbsp; Y &nbsp; &nbsp; + /<br>&nbsp;+---------+<br>&nbsp;+ &nbsp; X &nbsp; &nbsp; + /<br>&nbsp;+---------+ - TPoint2<br>&nbsp;+ &nbsp; Y &nbsp; &nbsp; + /<br>&nbsp;+---------+<br>&nbsp;+ &nbsp; . &nbsp; &nbsp; +<br>&nbsp;+ &nbsp; . &nbsp; &nbsp; +<br>&nbsp;+ &nbsp; . &nbsp; &nbsp; +<br><br>array of Pointer 也是这样的:<br>&nbsp;+---------+<br>&nbsp;+ &nbsp;Addr1 &nbsp;+ / &nbsp;指向的地址也许无效,不能念问!但系统处理的只是这个地址值!<br>&nbsp;+---------+ - 是不是相当于一个TPoint<br>&nbsp;+ &nbsp;Addr2 &nbsp;+ /<br>&nbsp;+---------+<br>只是将TPoint中的每个整数以地址的形式存放在Pointer数组中,<br>只要将这个结构的首地址传给API,系统处理还是一样的的.
 
如果你觉得迷惑,就直接利用array of TPoint吧,这样方便,又安全,我可以贴个例子出来<br>上面的例子,你是忘记了将TList释放掉吧,造了内存泄露!
 
回复Fssky:<br>&nbsp; &nbsp; 谢谢你的帮助,我想我已经基本了解了.我现在正在研究EHLIB控件的TPrintDBGridEh,<br>不知你是否使用此控件,我想你能帮助我的,不知可否?<br>&nbsp; &nbsp;我的E-Mail:hahong@163.com QQ:723334<br>&nbsp;
 
呵呵,不用客气,大家互相学习吧,EHLib这个控件也使用过,你如果有什么问题可以<br>提出来,共同探讨!
 
我现在在EHLIB V2.0的基础上增加了保存打印设置功能(纸张,字体,边距等,<br>现在我准备再增加两项功能:<br>1:打印时增加页小计.<br>2.增加固定列打印功能.<br>我已经读了一天的原代码了,正在做第二项工作.<br>
 
to hooyu:<br>1、页小计功能好像控件本身已经有了吧<br>2、固定列打印是什么意思?难道他现在打印的都是不固定的?
 
后退
顶部