哎,可怜可怜我这个菜鸟吧(50分)

  • 主题发起人 主题发起人 的士
  • 开始时间 开始时间

的士

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;
 
交点处留下空白,是否就是小黑块的大小呢?
运用异或方式不应该出现这种问题。
再有,画黑块直接用Canvas.Rectangle(...)好了。
 
对呀,就是那个小黑块呀。
 
异或不会有问题的,参考自己改。
procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.Pen.Mode :=pmNotXor;
Canvas.Rectangle(30,30,77,77);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Canvas.Rectangle(30,30,77,77);
end;
 
接受答案了.
 
后退
顶部