DelphiXE2之GDI+研究

首先感谢万一老师,在您的博文中收益匪浅。

首先用万一老师的示例,来自(http://www.cnblogs.com/del/archive/2011/11/08/2241746.html

uses Winapi.GDIPAPI, Winapi.GDIPOBJ{, Winapi.GDIPUTIL};

procedure TForm1.FormPaint(Sender: TObject);
var
  graphics: TGPGraphics;
  pen: TGPPen;
begin
  graphics := TGPGraphics.Create(Canvas.Handle);
  pen := TGPPen.Create(MakeColor(255,0,0));
  graphics.DrawRectangle(pen, MakeRect(11, 22, 33, 44));
  pen.Free;
  graphics.Free;
end;

这段代码,如果移到一个Button的OnClick事件中,一样可以正常运行。

但是根据“常识”,总感觉这样每次使用都要创建,销毁似乎性能太低下了,于是决定尝试在FormCreate中创建对象,在FormDestory中销毁。

procedure TForm4.FormCreate(Sender: TObject);
begin
  graphics := TGPGraphics.Create(Canvas.Handle);
  pen      := TGPPen.Create(MakeColor(255,0,0));
end;

procedure TForm4.FormDestroy(Sender: TObject);
begin
  pen.Free;
  graphics.Free;
end;

procedure TForm4.FormPaint(Sender: TObject);
begin
  graphics.DrawRectangle(pen, MakeRect(10,10, 100,50));
end;

效果不错,一切正常;然后又想,这放到OnPaint事件中,似乎画的太频繁了吧,而且不好控制,放到Button事件中看看如何;

procedure TForm4.btn1Click(Sender: TObject);
begin
  graphics.DrawRectangle(pen, MakeRect(10,10, 100,50));
end;

怪事情出现了,没有用!这是怎么回事呢?

这还不算奇怪,最奇怪的是,你现在把代码恢复过去,还放到OnPaint事件中,也一样不行了。

另外这里要提一下,如果把代码中的Canvas.Handle换成一个TImage.Canvas.Handle,则代码没有任何反应,应该是Image的Canvas还没有用到GDI+

 

不过这样以来,似乎反倒是有点眉目了,放了一个Button控件,同样的代码就不起作用了,那肯定是引用了什么单元,和GDI+冲突了;

于是把Button删除掉,把Uses区删除的只保存以下内容:

 Vcl.Forms, Winapi.GDIPAPI, Winapi.GDIPOBJ;

再运行程序,又可以了;

果然,测试出来Vcl.Graphics,  Vcl.Controls两个单元只要一引用,代码就无效了。可是这就有个大问题了,无论如何,程序总是要与用户交互的,而且GDI+,相对较多的是与鼠标交互,可是现在Form的鼠标事件

procedure TFormXX.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

也有一个TMouseButton的引用啊,这怎么办?  

 好吗,这整个一时隐时现,完全乱了套了,想了想,又把这个事件放到OnPaint中,结果竟然也不行了!

真是让我有点蒙了,怎么回事?想来想去,只有一点可能性,就是Dcu文件可能有问题,于是重新Shift + F9编译程序,嘿,又可以了。 

 

而且到这里之后,开始出现,一会儿编译可以,一会儿又不行,我觉得是不是和当前运行的程序有关系,就把其它程序关掉,只留下Delphi,可依然不行,脑子有点乱,稍后继续。

 

 

posted @ 2012-05-20 19:44  极度生存  阅读(708)  评论(2编辑  收藏  举报