本人在使用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中使用,该如何做呢?
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中使用,该如何做呢?
begin
hdc_temp:=getdc(form1.Handle);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
Rectangle(hdc_temp,100,100,200,200);
end;
这就画在了Form上,要求是画在image上!
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.
showmessage(inttostr(hdc_temp));就知道了
因为显示设备(不一定指显示器..可能是缓冲页内的内容..)是共用的..
如果做过DOS的人都知道..每次显示都有三个页面的..
把一个页状态变为显示就是当前你看到的东西..
所以..很多共用的东西你应该用完把它释放掉然后做一个清客户区的操作..
确保你的程序没有破坏别进程在用的东西..
好比如你拉完屎后..应该把大便冲掉一样..呵呵..
这个比喻用点恶...
我在实验中发现在两个showmessage(inttostr(self.Image1.Canvas.Handle));
showmessage(inttostr(hdc_temp));结果是一样的?
getdc(image1)编译时就通不过!
showmessage(inttostr(hdc_temp));就知道了