如何运用ExtCreatePen, 画宽度大于1的虚线 ( 积分: 100 )

  • 主题发起人 主题发起人 sephy
  • 开始时间 开始时间
S

sephy

Unregistered / Unconfirmed
GUEST, unregistred user!
当宽度大于等于2时,Pen.Style无效,此时如何画虚线?
请最好用ExtCreatePen实现

找到了这篇资料
http://community.borland.com/article/0,1410,26475,00.html
 
当宽度大于等于2时,Pen.Style无效,此时如何画虚线?
请最好用ExtCreatePen实现

找到了这篇资料
http://community.borland.com/article/0,1410,26475,00.html
 
问题已经解决,代码如下
function CreateWidthPen(w:Cardinal; Color:Cardinal):HPen;
var LogBrush : tLogBrush;
Userstyle : array[0..1] of integer;
begin
UserStyle[0]:=18+w div 4;
UserStyle[1]:=5+w;
LogBrush.lbStyle := BS_Solid;
LogBrush.lbColor := Color;
LogBrush.lbHatch := 0;
Result:=ExtCreatePen(PS_GEOMETRIC or PS_USERSTYLE,
w, LogBrush, 2, @Userstyle);
end;
此处用的PS_USERSTYLE说明了会使用最后一个参数中的数组的样子作画,倒数第2个元素说明了Userstyle数组的元素是2个(2个不停的循环,0个是画实线,1是不画线,如此往复形成虚线)

使用此函数用以下方法:
with XXX.Canvas do
begin
OW:=Pen.Width; OC:=Pen.Color;
Pen.Handle:=CreateWidthPen(OW,OC);
MoveTo(P1.X,P1.Y);
LineTo(P2.X,P2.Y);
DeleteObject(Pen.Handle);
Pen.Width:=OW; Pen.Color:=OC;
end;

另外问一个可能挺愚蠢的问题,为什么这样写不行?
with XXX.Canvas do
begin
oldPen:=TPen.Create;
oldPen:=Pen;
Pen.Handle:=CreateWidthPen(oldPen.Width,oldPen.Color);
MoveTo(P1.X,P1.Y);
LineTo(P2.X,P2.Y);
DeleteObject(Pen.Handle);
Pen:=oldPen;
end;

oldPen:=Pen;
这样不能赋值啊? 只是引用? 如何赋值?
用Assign?
 
后退
顶部