我要求在一个已经显示在image里的图像(图像位于image的中央)上运用鼠标划定一个区域(可以是一个矩形),然后拖动这个区域,在这个图像上选择我所感兴趣的部分,再把最后确定的区域的四个顶点的坐标位置传送到一个过程里面
谢谢 那位大哥可以解答

解决方案 »

  1.   

    不明白你的拖动是做什么用的。如果拖动后,被拖动的地方是否是空白显示?
    即你将一个区域选择后拖动到一个地方,空余出来的地方是白的。如果你在重新选择一个区域,再拖动,则原来被覆盖的地方同样是空白区域?如果这样的话就好一点。
    不过还是不明白。好像你的拖动和参数是两个不相关的功能。实际上你使用Image是非常不现实的选择,因为Image本身集成了很多功能,你如果进行画图的时候会触发很多的东西,会造成屏幕的闪烁。
    我使用Form的Canvas来做,首先将现实图片的功能写在下面:
      

  2.   

    如果你的图片是bmp图片,不是jpg图片,则简单些。在FormCreate中载入,在onPaint中刷新图片。
    首先声明一个全局变量: 
    bmp: TBitmapformOnCreate:
    begin
      bmp:=TBitmap.Create;
      Bmp.LoadFromFile('');
      BitBlt(Canvas.Handle,0,0,Width,Height,bmp.canvas.handle,0,0,srccopy);  //具体范围和参数需要你自己设置,你自己看bitblt的帮助。
    end;formOnPaint
    begin
      BitBlt(Canvas.Handle,0,0,Width,Height,bmp.canvas.handle,0,0,srccopy);  //具体范
    围和参数需要你自己设置,你自己看bitblt的帮助。
    end;formOnDestroy
    begin
      bmp.Free;
    end;
      

  3.   

    靠,真累,你给我mail,我给你寄一个Demo吧。
    [email protected]
      

  4.   

    TForm1 = class(TForm)
        Panel1: TPanel;
        chb_SelectRect: TCheckBox;
        procedure FormCreate(Sender: TObject);
        procedure FormPaint(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure chb_SelectRectClick(Sender: TObject);
        procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
        selectRect: TRect;
        bmp: TBitmap;       //图片载入。全局变量,在formcreat和OnPaint的时候重新刷新。
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      bmp:=TBitmap.Create;
      bmp.LoadFromFile('e:\1.bmp');
      BitBlt(Canvas.handle,0,0,bmp.Width,bmp.Height,bmp.Canvas.Handle,0,0,SRCCopy);
    end;procedure TForm1.FormPaint(Sender: TObject);
    begin
      BitBlt(Canvas.handle,0,0,bmp.Width,bmp.Height,bmp.Canvas.Handle,0,0,SRCCopy);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      bmp.Free;
    end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if chb_SelectRect.Checked then
      begin
        SelectRect.Left:=x;
        SelectRect.Top:=y;
        SelectRect.Right:=x;
        SelectRect.Bottom:=y;
      end;
    end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if SelectRect.Left<0 then exit;
      if chb_SelectRect.Checked then
      with Canvas do
      begin
        Pen.Mode:=pmNotXor;
        MoveTo(SelectRect.Left,SelectRect.Top);
        LineTo(SelectRect.Left,SelectRect.Bottom);
        LineTo(SelectRect.Right,SelectRect.Bottom);
        LineTo(SelectRect.Right,SelectRect.Top);
        LineTo(SelectRect.Left,SelectRect.Top);
        SelectRect.Right:=x;
        SelectRect.Bottom:=y;
        MoveTo(SelectRect.Left,SelectRect.Top);
        LineTo(SelectRect.Left,SelectRect.Bottom);
        LineTo(SelectRect.Right,SelectRect.Bottom);
        LineTo(SelectRect.Right,SelectRect.Top);
        LineTo(SelectRect.Left,SelectRect.Top);
      end;
    end;procedure TForm1.chb_SelectRectClick(Sender: TObject);
    begin
      SelectRect.Left:=-1;
    end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Chb_SelectRect.Checked then
      chb_SelectRect.Checked:=False;
    end;
      

  5.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        chb_SelectRect: TCheckBox;
        chb_DrawRect: TCheckBox;
        procedure FormCreate(Sender: TObject);
        procedure FormPaint(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure chb_SelectRectClick(Sender: TObject);
        procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
        selectRect: TRect;
        bmp: TBitmap;       //图片载入。全局变量,在formcreat和OnPaint的时候重新刷新。
        RectBmp: TBitmap;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      bmp:=TBitmap.Create;
      bmp.LoadFromFile('e:\1.bmp');
      RectBmp:=TBitmap.Create;
      BitBlt(Canvas.handle,0,0,bmp.Width,bmp.Height,bmp.Canvas.Handle,0,0,SRCCopy);
    end;procedure TForm1.FormPaint(Sender: TObject);
    begin
      if not chb_DrawRect.Checked then
      BitBlt(Canvas.handle,0,0,bmp.Width,bmp.Height,bmp.Canvas.Handle,0,0,SRCCopy);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      bmp.Free;
      RectBmp.Free;
    end;procedure TForm1.chb_SelectRectClick(Sender: TObject);
    begin
      if Chb_SelectRect.Checked then
      SelectRect.Left:=-1;
    end;
    procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if chb_SelectRect.Checked then
      begin
        SelectRect.Left:=x;
        SelectRect.Top:=y;
        SelectRect.Right:=x;
        SelectRect.Bottom:=y;
      end else
    end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if chb_SelectRect.Checked then
      begin
        if SelectRect.Left<0 then exit;
        with Canvas do
        begin
          Pen.Mode:=pmNotXor;
          MoveTo(SelectRect.Left,SelectRect.Top);
          LineTo(SelectRect.Left,SelectRect.Bottom);
          LineTo(SelectRect.Right,SelectRect.Bottom);
          LineTo(SelectRect.Right,SelectRect.Top);
          LineTo(SelectRect.Left,SelectRect.Top);
          SelectRect.Right:=x;
          SelectRect.Bottom:=y;
          MoveTo(SelectRect.Left,SelectRect.Top);
          LineTo(SelectRect.Left,SelectRect.Bottom);
          LineTo(SelectRect.Right,SelectRect.Bottom);
          LineTo(SelectRect.Right,SelectRect.Top);
          LineTo(SelectRect.Left,SelectRect.Top);
        end;
      end;  if chb_DrawRect.Checked then
      if [ssLeft]=Shift then
      begin    LockWindowUpdate(Canvas.handle);  //锁定屏幕的刷新
        try
        //=======刷新背景===============
          BitBlt(Canvas.Handle,0,0,Bmp.Width,Bmp.Height,Bmp.Canvas.Handle,0,0,SrcCopy);
          //=======画新被拖动的图片========
          BitBlt(Canvas.Handle,x,y,RectBmp.Width,RectBmp.Height,RectBmp.Canvas.Handle,0,0,SrcCopy);
        finally
          LockWindowUpdate(0);  //解除屏幕刷新锁定
        end;
      end;
    end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Chb_SelectRect.Checked then
      chb_SelectRect.Checked:=False;
      if Chb_DrawRect.Checked then
      chb_DrawRect.Checked:=False;  //========将选择的图片复制到rectBmp中
      RectBmp.Width:=SelectRect.Right-SelectRect.Left;
      RectBmp.Height:=SelectRect.Bottom-SelectRect.Top;
      BitBlt(RectBmp.Canvas.Handle,0,0,RectBmp.Width,RectBmp.Height,Bmp.Canvas.Handle,SelectRect.Left,SelectRect.Top,SrcCopy);
    end;end.
    还有很多的小bug,不过基本的算法就是这样的,你自己改吧。
    如果你一定要用Image,则只要在Image的Mouse事件中写东西就可以了,另外bitblt的参数中form.canvas要改成Image.Canvas就可以了
      

  6.   

    在image上创建一个tshape,pen brush都设成clear就可以了,实际上是拖动那个tshape.