我要把当在界面上按下鼠标左键(mousedown)直到鼠标左键松开(mouseup)这部分选中的矩形区域用虚线(或者实线)括起来,就向我们在桌面上按下鼠标左键一样,这种效果应该如何实现呀,如果知情,多谢指导。

解决方案 »

  1.   

    我这几天试了一下,在ONMouseDown()中,记住起点,然后在OnMouseMove中调用canvas.Rectangle(x1,y1,x2,y2)来实现画方框,但是我没法只保留最后画的方框,原来的轨迹如何清除掉呢,谢谢大家帮个忙。
      

  2.   

    你在OnMouseUp事件里canvas.Rectangle(x1,y1,x2,y2)
    就可以得到最后画的框了
      

  3.   

    SORRY 刚才搞错了 
    用这个
    Canvas.FillRect(Canvas.ClipRect);
    清除原来画的矩形
      

  4.   

    还是不行呀,如何实现在原来的位置再重画一次呢,没有找到方法,
    还有就是Canvas.FillRect(Canvas.ClipRect)实现不了。GetCursorPos该怎么用呢?
      

  5.   

    Canvas.FillRect(Canvas.ClipRect)不行?
    我用着好好的啊
    在你onmousedown的事件里调用的,把以前的清掉
      

  6.   

    但是我把这个fillrect()放在IMAGE控件的MOUSE事件中,Image中原来的图就没有了,变成了白底,该怎么处理呀,谢谢。
      

  7.   

    在onMouseUp中用一次Refurbish方法即可。
      

  8.   

    Refurbish是哪个控件的方法呀,没有找到。请赐教,谢谢
      

  9.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
        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);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}var
      oldx,oldy,ox,oy:word;
      started:boolean;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      oldx:=x;
      oldy:=y;
      ox:=x;
      oy:=y;
      started:=true;
    end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if started then
      begin
        form1.Canvas.Brush.Style:=bsclear;
        form1.Canvas.Rectangle(ox,oy,x,y);
        form1.Canvas.Rectangle(ox,oy,oldx,oldy);
        oldx:=x;
        oldy:=y;
      end;
    end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      started:=false;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      form1.Canvas.Pen.Mode:=pmNot;
    end;end.
      

  10.   

    //用另一种方法来画虚线框: drawFocusRect apiunit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
        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 }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}var
      ox,oy,oldx,oldy:integer;
      started:boolean;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      ox:=x;
      oy:=y;
      oldx:=x;
      oldy:=y;
      started:=true;
    end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if started then
      begin
        drawFocusRect(getdc(form1.Handle),rect(ox,oy,x,y));
        drawFocusRect(getdc(form1.Handle),rect(ox,oy,oldx,oldy));
        oldx:=x;
        oldy:=y;
      end;
    end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      started:=false;
    end;end.
      

  11.   

    是还有问题,多谢goomoo(古木)大哥提醒
      

  12.   

    要是用vc就很容易解决了
    CLientDC dc(this);
    dc.SetROP2(R2_NOT);
    反色就实现画橡皮筋了。不过在delphi中的思路是一样的,当每次mousemove时,将原来画的线再用反色覆盖,然后画新的
      

  13.   

    动动脑筋嘛,看下面的代码,少作改动就可以了:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
        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 }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}var
      ox,oy,oldx,oldy:integer;
      started:boolean;
      oldRect:TRect;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      ox:=x;
      oy:=y;
      oldx:=x;
      oldy:=y;
      started:=true;  drawFocusRect(getdc(form1.Handle),oldrect);  oldrect.Left:=x;
      oldRect.Top:=y;
    end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if started then
      begin
        drawFocusRect(getdc(form1.Handle),rect(ox,oy,x,y));
        oldRect.Right:=x;
        oldRect.Bottom:=y;
        drawFocusRect(getdc(form1.Handle),rect(ox,oy,oldx,oldy));
        oldx:=x;
        oldy:=y;
      end;
    end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      started:=false;
    end;end.
      

  14.   

    添加一个oldRect,记录上次的 矩形数据,然后重绘。