本人在使用Delphi开发中,欲将一个image对象的handle传出供其他程序使用,先做了如下的实验,代码如下:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  hdc_temp:HDC;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
begin
    self.Image1.Canvas.Rectangle(200,30,40,50);
    hdc_temp:=self.Image1.Canvas.Handle;
    showmessage(inttostr(hdc_temp));
//    Rectangle(hdc_temp,100,100,200,200);end;procedure TForm1.Button2Click(Sender: TObject);
begin
    showmessage(inttostr(self.Image1.Canvas.Handle));    Rectangle(hdc_temp,100,100,200,200);
    self.Image1.Repaint;
end;end.
发现,在Button1Click中,可以Rectangle(hdc_temp,100,100,200,200);在Button2Click中,却绘制不出矩形,请各位大侠指点迷津。要在Button2Click中使用,该如何做呢?

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
       hdc_temp:=getdc(form1.Handle);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
        Rectangle(hdc_temp,100,100,200,200);
    end;
      

  2.   

    lion_lh(xmanx) :
    这就画在了Form上,要求是画在image上!
      

  3.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Image1: TImage;
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        hdc_temp:HDC;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      self.Image1.Canvas.Rectangle(200,30,40,50);
      hdc_temp:=self.Image1.Canvas.Handle;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      hdc_temp:=self.Image1.Canvas.Handle;
      Rectangle(hdc_temp,100,100,200,200);
    end;end.
      

  4.   

    HDC并不是不变的,在button2中的hdc_temp已经是以前的无效的dc了,所以不能再画了,你用    showmessage(inttostr(self.Image1.Canvas.Handle));
        showmessage(inttostr(hdc_temp));就知道了
      

  5.   

    你在用完DC..一定要释放...
    因为显示设备(不一定指显示器..可能是缓冲页内的内容..)是共用的..
    如果做过DOS的人都知道..每次显示都有三个页面的..
    把一个页状态变为显示就是当前你看到的东西..
    所以..很多共用的东西你应该用完把它释放掉然后做一个清客户区的操作..
    确保你的程序没有破坏别进程在用的东西..
    好比如你拉完屎后..应该把大便冲掉一样..呵呵..
    这个比喻用点恶...
      

  6.   

    用getdc(image1)得到image的设备环境变量.
      

  7.   

    to firetoucher(风焱) :
    我在实验中发现在两个showmessage(inttostr(self.Image1.Canvas.Handle));
        showmessage(inttostr(hdc_temp));结果是一样的?
      

  8.   

    to windwather() :
    getdc(image1)编译时就通不过!
      

  9.   

    HDC并不是不变的,在button2中的hdc_temp已经是以前的无效的dc了,所以不能再画了,你用    showmessage(inttostr(self.Image1.Canvas.Handle));
        showmessage(inttostr(hdc_temp));就知道了