我的画图程序,在移动图形或改变图形大小时会占用大量的CPU时间,请问该如何改进。(50分)

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

的士

Unregistered / Unconfirmed
GUEST, unregistred user!
相关代码如下:

{ 移动 }
procedure TLine.Move(offsetX, offsetY: Integer);
begin
Canvas.Pen.Mode := pmNotXor;

{ 首次移动,保存原来的线段位置 }
if not FMoving then
begin
FOldBeginPoint := FBeginPoint;
FOldEndPoint := FEndPoint;
end
{ 如果正在移动,则擦除原来的线段 }
else begin
Canvas.MoveTo(FBeginPoint.X, FBeginPoint.Y);
Canvas.LineTo(FEndPoint.X, FEndPoint.Y);
end;

{ 设置移动后的线段位置,并以虚线画出来 }
SetBeginEndPoint(Point(FBeginPoint.X + offsetX, FBeginPoint.Y + offsetY),
Point(FEndPoint.X + offsetX, FEndPoint.Y + offsetY));
Canvas.Pen.Style := psDot;
Canvas.MoveTo(FBeginPoint.X, FBeginPoint.Y);
Canvas.LineTo(FEndPoint.X, FEndPoint.Y);

FMoving := True;
end;

{ 根据当前坐标位置改变线段大小 }
procedure TLine.ReSize(ACurPoint: TPoint);
begin
Canvas.Pen.Mode := pmNotXor;

{ 首次改变线段的大小,保存原来线段的位置 }
if (not FChangingBeginPoint) and (not FChangingEndPoint) then
begin
FOldBeginPoint := FBeginPoint;
FOldEndPoint := FEndPoint;
end
{ 擦除上次画的线段 }
else begin
Canvas.MoveTo(FBeginPoint.X, FBeginPoint.Y);
Canvas.LineTo(FEndPoint.X, FEndPoint.Y);
end;

if not FChangingBeginPoint then
FChangingBeginPoint := PtInRect(FSelectBlock1, ACurPoint);

if not FChangingEndPoint then
FChangingEndPoint := PtInRect(FSelectBlock2, ACurPoint);

if FChangingBeginPoint then SetBeginPoint(ACurPoint);
if FChangingEndPoint then SetEndPoint(ACurPoint);
Canvas.Pen.Style := psDot;
Canvas.MoveTo(FBeginPoint.X, FBeginPoint.Y);
Canvas.LineTo(FEndPoint.X, FEndPoint.Y);
end;

{ 设置线段的起始位置和终止位置 }
procedure TLine.SetBeginEndPoint(ABeginPoint, AEndPoint: TPoint);
begin
SetBeginPoint(ABeginPoint);
SetEndPoint(AEndPoint);
end;

{-------------------- Private --------------------}

{ 设置线段的开始位置 }
procedure TLine.SetBeginPoint(Value: TPoint);
begin
if (Value.X <> FBeginPoint.X) or (Value.Y <> FBeginPoint.Y) then
begin
FBeginPoint := Value;
FSelectBlock1 := Rect(FBeginPoint.X - 3, FBeginPoint.Y - 3,
FBeginPoint.X + 4, FBeginPoint.Y + 4);
end;
end;

{ 设置线段的结束位置 }
procedure TLine.SetEndPoint(Value: TPoint);
begin
if (Value.X <> FEndPoint.X) or (Value.Y <> FEndPoint.Y) then
begin
FEndPoint := Value;
FSelectBlock2 := Rect(FEndPoint.X - 3, FEndPoint.Y - 3,
FEndPoint.X + 4, FEndPoint.Y + 4);
end;
end;
 
仅仅是图形的操作不会占用太多的CPU时间,你的程序也没涉及太复杂的运算。
 
哦对了,千堆雪,你给我的那个线条可以选中的那个程序,在拖动线条的时候也是占用了
大量的CPU时间。
 
不要吓我,会占用多少?
 
90%--99%之间,跟我的一样。
另外,还有一个CSDN的也给我发过这样一个程序,在移动图像的时候也是一样大大的占用。
不知是不是CPU太烂了。
赛扬900的。
 
我拷贝移动图象才占了30%;
当然偶是P3 800.....
 
接受答案了.
 
后退
顶部