我定义了一个  G_Handle:THandle   全局句柄,发现在当前函数(即Button1Click)中赋值时,能正常画图,
而在 另外函数(比如 Button2Click)中先赋值,再点击画图函数时,就无法实现画图。
刚接触GDI+,很困惑这个问题,盼老手指点迷津~~
procedure TForm1.Button1Click(Sender: TObject);
var
  g: TGPGraphics;
  p: TGPPen;
begin
  GL_Handle:= image1.Canvas.Handle;
  g := TGPGraphics.Create(GL_Handle);
  p := TGPPen.Create(0, 2);
  p.SetColor(aclRed);
  g.DrawRectangle(p,10,10,20,20);
  g.Free;
  p.Free;
  Image1.Repaint;
end;

解决方案 »

  1.   

    你说的这个问题与GDI+无关!而是在Delphi中,对诸如设备、字体、画刷句柄等资源都是动态管理的,特别是设备DC,TCanvas.Handle也是通过属性动态返回的,所以,我们都只能“即时”地去引用这些资源,所以你在Button1Click中使用没问题,设置全局变量也没问题,问题是这个资源的引用过程必须是连续的,如果你在另外的事件中再去引用全局变量,就等于中间有了间隔,当然就有可能不正确了。
      

  2.   

    感谢阿发伯!
    我在另外一个帖子中看到您的回复  Create(form1.Handle, False) 这样创建的TGPGraphics可以重复使用,是不是就是因为Form的句柄是个稳定的句柄,同样的,像Panel的句柄也是稳定的吧?
    但是如果要在 TImage 这个控件上实现,该怎么稳定创建呢,TImage好像没有handle句柄属性,
    只有canvas.handle 这个句柄.
      

  3.   

    好像弄错了,form的窗体大小以改变,TGPGraphics 画出的图形 还是原来的大小...
      

  4.   

    你说的不错,窗口的句柄在窗口的生存期间是不变的,而DC句柄都是“即时”获取的。Timage不是窗口类,而是图形类,所以没有窗口句柄。只能“即时”的去引用它的Canvas.Handle
      

  5.   

    TGPGraphics虽然可以用窗口句柄创建对象,但其内部还是通过窗口句柄转换为HDC类型了的,而这个HDC就已经锁定了窗口以前的大小(这也证明了HDC是即时的),你以后改变窗口大小,与TGPGraphics已经没关系了。
      

  6.   

    建议你多看点Windows API的资料,就明白这些了