我想说的是画矩形图我已经实现,但是当有窗口或者其它的东西盖住之后就会被擦掉,请问这个问题怎么解决?

解决方案 »

  1.   

    Image1MouseMove   Image1MouseDown  Image1MouseUp
    在Image1MouseDown  事件里画的
      

  2.   

    要下班了,没时间了,这里有个演示代码,你去看一下:http://rabbitfox.blog.sohu.com/50812083.html
      

  3.   

    被其它窗口盖住,再显出来会产生WM_PAINT事件,Image被重画,你必须继承Image写一个你自己的Image,并且覆盖Paint方法.
    或者用TPaintBox,将画矩形的语句写在OnPaint事件中
      

  4.   

    先画在一个TBitmap里,在onpaint里把bitmap画在image里
      

  5.   

    1. 画图控件用 TPaintBox。
    2. 你得记住这个矩形对象,在PaintBox的OnPaint事件中画出该矩形。
      

  6.   

    试过3楼的例子,  写的不错
    但是有个小问题, 如果我把 Image的Stretch属性设为true的时候(因为我想实现图片缩放再裁剪),  画矩形 就不稳定了.请问这是什么原因?
    因为我之前是在Form1窗体上画的就不会有这问题,但是就会被别的窗体或者拖到屏幕的边上就会被擦掉,    
    我想实现  图片缩放,然后再可以画矩形,再裁剪.能不能实现?
      

  7.   


    那需要换算。其实你自己已经可以试着改一下了。动手写代码解决小问题可以提高自己的编程水平。另外,再参考这个例子:http://hi.baidu.com/382943850/blog/item/2fb06708eb4d19d463d986ee.html
      

  8.   

    再问一下, 在Form窗体上画的 图像能不能保存的?怎么保存?
      

  9.   


    Form.Canvas可以CopyRect的
    很想帮你,但无奈啊今天又喝醉了,写不了。自己不可以研究一下吗?劝你还是要自己研究一下这种简单问题。
      

  10.   

    我研究了一早上了, 到网上什么例子都试过,但是就是不能解决 把Stretch属性设为true后 再画矩形 的时候让  鼠标的位置 和实际在图像的位置在同一个点上.
    由于之前没学过delphi,我是搞JAVA的,
    用delphi只做过一个简单的管理系统,像图像处理的我从来没接触过.
      

  11.   

    在图片不同的位置它的 X,Y 坐标的比例是不一样,  如果它好像是从左上角到右下角 在慢慢地 扩大X,Y坐标的比例
      

  12.   

    to 楼主:那你再研究一下这个代码,刚刚给你改的。c:\test.bmp是一个位图,尽量弄得长宽比大一些,以便测试。
    工程在主窗体上需要两个image,不要更改设置(在代码中已有你关心的设置)Image1是缩略图,鼠标操作就是在它上面进行
    Image2是原始尺寸,用于直观地看到缩略图位置与实际的对比你测试一下。尽管在Image1(缩略图)中看起来画的线有可能看不清(那是我技术处理还不到位,水平问题!酒的问题!),但大体上位置已经差不多了。思路就是这个思路!
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Image1: TImage;
        Button1: TButton;
        Image2: TImage;
        procedure Button1Click(Sender: TObject);
        procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}var
      BMP: TBitmap;
      Wdth, Hght : integer;
      CanSelect: Bool;
      rFrom: TRect;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Self.Image1.AutoSize := False;
      Self.Image1.Stretch := True;
      Self.Image2.AutoSize := True;
      Self.Image2.Stretch := False;
      if not Assigned(BMP) then BMP := TBitmap.Create;
      BMP.LoadFromFile('c:\test.bmp');
      Wdth := BMP.Width;
      Hght := BMP.Height;
      BMP.Canvas.Pen.Mode := pmNot;
      BMP.Canvas.Brush.Style := bsClear;
      Self.Image1.Picture.Bitmap.Assign(BMP);
      Self.Image2.Picture.Bitmap.Assign(BMP);
      rFrom := Rect(0, 0, 0, 0);
    end;procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbLeft then begin
        CanSelect := True;
        if (rFrom.Left<>rFrom.Right) and (rFrom.Top<>rFrom.Bottom) then
          BMP.Canvas.Rectangle(rFrom);
        rFrom.Left := Round(X * Wdth / Image1.Width);
        rFrom.Top := Round(Y * Hght / Image1.Height);
        rFrom.Right := Round(X * Wdth / Image1.Width);
        rFrom.Bottom := Round(Y * Hght / Image1.Height);
      end;
      Self.Image1.Picture.Bitmap.Assign(BMP);
      Self.Image2.Picture.Bitmap.Assign(BMP);
    end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      CanSelect := False;
    end;procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if CanSelect then begin
        BMP.Canvas.Rectangle(rFrom);
        rFrom.Right := Round(X * Wdth / Image1.Width);
        rFrom.Bottom := Round(Y * Hght / Image1.Height);
        BMP.Canvas.Rectangle(rFrom);
      end;
      Self.Image1.Picture.Bitmap.Assign(BMP);
      Self.Image2.Picture.Bitmap.Assign(BMP);
    end;end.
      

  13.   

    我是这样解决的, 应该可行吧//这是放大图片
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    Image1.ClientWidth:=Image1.ClientWidth+100;
    Image1.ClientHeight:=Image1.ClientHeight+100;BMP.Canvas.Rectangle(rFrom);
    BMP.Canvas.pen.width:=round(1200/Image1.ClientWidth);
    BMP.Canvas.Rectangle(rFrom);
    Self.Image1.Picture.Bitmap.Assign(BMP);
    end;