如题。
我现在的做法是每画一个图形,在一个文件中添加一条记录,在屏幕点击事件中判断光标的x,y,如果在记录的范围内,就算选中了,再根据这个记录在原来的图形的四周画出几个小正方形,表示选中,取消选中的时候,用背景色重画那几个小正方形。
拖动的过程用虚线画出一个矩形区域,随着鼠标的移动,矩形移动,等到达指定位置,擦出原来的图形,在新位置画出图形。如何表现这个矩形跟踪鼠标的过程呢?
要不停的擦除上一个位置,在新的位置画么?
这种方式是不是很浪费资源啊

解决方案 »

  1.   

    每画一个图,创建一个对象而不是在文件中添加一条记录。要表现这个过程嘛,很简单。画个框不就行了。注意画的时候采用XOR模式,这样在画新的矩形的时候,先在原来的地方再重画一下,就把原来的擦出了。很快的,不浪费资源的。
      

  2.   

    谢谢etomahawk
    添加一条记录是为了保存这个图形。比如画一个直线 moveto(x1,y1),lineto(x2,y2),我在文件里保存了x1,y1,x2,y2,这样下次我打开的时候还可以画出这条线。你都是用类来做的么?procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
       image1.Canvas.Pen.Mode:=pmxor;
       image1.Canvas.Rectangle(x,y,x+100,y+200);
    end;这样不行,麻烦你再写点代码给多解释一下吧
      

  3.   

    自己写的类。先定义一个基类,比如TBaseShape,其他的从它继承下来,比如圆形就可以这样定义: TCircleShape = class(TBaseShape);// 定义点击位置的枚举类型
    THitPos = (htNone, htLeftTop, htTop, htRightTop, htRight, htRightBottom, htBottom, htLeftBottom, htLeft);TBaseShape = class
    public
      // 判断选中是否选中,虚拟方法,子类继承并且处理之
      function HitTest(X, Y: Integer): THitPos; virtual;
      
    end;---------------------------------------------------
    用XOR方式擦除:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
        FIsDrag : Boolean;
        FLastPos: TPoint;
        FDragPos: TPoint;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      FIsDrag:= false;
    end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbLeft then
      begin
        FDragPos:= Point(X, Y);
        FLastPos:= FDragPos;
        FIsDrag := true;
      end;
    end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if FIsDrag then
      begin
        Self.Canvas.Brush.Style:= bsClear;
        Self.Canvas.Pen.Color  := clRed;
        Self.Canvas.Pen.Mode   := pmXor;
        Self.Canvas.Pen.Style  := psSolid;    Self.Canvas.Rectangle(FDragPos.X, FDragPos.Y, FLastPos.X, FLastPos.Y);
        FLastPos:= Point(X, Y);    Self.Canvas.Rectangle(FDragPos.X, FDragPos.Y, X, Y);
      end;
    end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      FIsDrag:= false;
    end;end.建议你去搜索一下矢量图形编辑器的代码。网上很多。
      

  4.   

    如果你的图形是在一个容器内画,那你的思路是对的,不过最好用双缓冲,要不然会很闪烁的!
    这点操作对现在的cpu和显卡构不成任何负担,所以谈不上浪费