的
的士
Unregistered / Unconfirmed
GUEST, unregistred user!
一个画图程序,可以选中已画好的图形,并进行拖放。下面以线段为例,
当画了一条线段后,然后再第二条线段,假设这条线段的起始点或终点在第一条线段上,
当选中第二条线段后,第二条线段的两个端点出现小黑块表示选中了该线段,当点击其它
地方后,选择块消失,但第一条线段的和第二条线段的交点处会留下空白,即被擦掉了。
这个问题应该如何解决。
下面是线段类的Paint方法。
procedure TLine.Paint;
var
oldColor: TColor;
begin
Canvas.Pen.Style := psSolid;
{ 如果是线段移动后或改变大小后重画,则擦除移动或改变大小之前的线段 }
if FMoving or FChangingBeginPoint or FChangingEndPoint then
begin
Canvas.Pen.Mode := pmNotXor;
Canvas.MoveTo(FOldBeginPoint.X, FOldBeginPoint.Y);
Canvas.LineTo(FOldEndPoint.X, FOldEndPoint.Y);
Canvas.FillRect(Rect(FOldBeginPoint.X - 3, FOldBeginPoint.Y - 3,
FOldBeginPoint.X + 4, FOldBeginPoint.Y + 4));
Canvas.FillRect(Rect(FOldEndPoint.X - 3, FOldEndPoint.Y - 3,
FOldEndPoint.X + 4, FOldEndPoint.Y + 4));
end;
oldColor := Canvas.Brush.Color;
if Selected then //如果选中了线段
Canvas.Brush.Color := clBlack;
Canvas.FillRect(FSelectBlock1);
Canvas.FillRect(FSelectBlock2);
Canvas.Brush.Color := oldColor;
Canvas.Pen.Mode := pmCopy;
Canvas.MoveTo(FBeginPoint.X, FBeginPoint.Y);
Canvas.LineTo(FEndPoint.X, FEndPoint.Y);
FMoving := False;
FChangingBeginPoint := False;
FChangingEndPoint := False;
end;
当画了一条线段后,然后再第二条线段,假设这条线段的起始点或终点在第一条线段上,
当选中第二条线段后,第二条线段的两个端点出现小黑块表示选中了该线段,当点击其它
地方后,选择块消失,但第一条线段的和第二条线段的交点处会留下空白,即被擦掉了。
这个问题应该如何解决。
下面是线段类的Paint方法。
procedure TLine.Paint;
var
oldColor: TColor;
begin
Canvas.Pen.Style := psSolid;
{ 如果是线段移动后或改变大小后重画,则擦除移动或改变大小之前的线段 }
if FMoving or FChangingBeginPoint or FChangingEndPoint then
begin
Canvas.Pen.Mode := pmNotXor;
Canvas.MoveTo(FOldBeginPoint.X, FOldBeginPoint.Y);
Canvas.LineTo(FOldEndPoint.X, FOldEndPoint.Y);
Canvas.FillRect(Rect(FOldBeginPoint.X - 3, FOldBeginPoint.Y - 3,
FOldBeginPoint.X + 4, FOldBeginPoint.Y + 4));
Canvas.FillRect(Rect(FOldEndPoint.X - 3, FOldEndPoint.Y - 3,
FOldEndPoint.X + 4, FOldEndPoint.Y + 4));
end;
oldColor := Canvas.Brush.Color;
if Selected then //如果选中了线段
Canvas.Brush.Color := clBlack;
Canvas.FillRect(FSelectBlock1);
Canvas.FillRect(FSelectBlock2);
Canvas.Brush.Color := oldColor;
Canvas.Pen.Mode := pmCopy;
Canvas.MoveTo(FBeginPoint.X, FBeginPoint.Y);
Canvas.LineTo(FEndPoint.X, FEndPoint.Y);
FMoving := False;
FChangingBeginPoint := False;
FChangingEndPoint := False;
end;