高手帮忙看看什么问题

以下是关于在窗口上显示一幅画面的简短程序,可问题是图片显示不出来,高手请帮忙!

with Glib;              use Glib;
with Glib.Error;        use Glib.Error;
with Gtk.Box;           use Gtk.Box;
with Gtk.Drawing_Area;  use Gtk.Drawing_Area;
with Gdk.Pixbuf;        use Gdk.Pixbuf;
with Gtk.Handlers;      use Gtk.Handlers;
with Gtk.Style;         use Gtk.Style;
with Gtk.Widget;        use Gtk.Widget;
with Gdk.Rgb;           use Gdk.Rgb;

with gtk.window;use gtk.window;
with gtk.main;use gtk.main;

with gnat.io;use gnat.io;

procedure draw is
  
   window:gtk_window;
  
   error:Glib.Error.GError;
  
   type drawing_record is new gtk.box.gtk_box_record with record
      draw_area:gtk_drawing_area;
      draw_buffer:gdk_pixbuf;
   end record;
  
   type drawing is access all drawing_record'class;
  
   draw:drawing:=new drawing_record;
  
   function show(draw:access drawing_record'class)return boolean is
   begin
      render_to_drawable(draw.draw_buffer,
                      get_window(draw.draw_area),
                      Gtk.Style.Get_Black_Gc (Get_Style (Draw.draw_Area)),
                      0,0,0,0,
                      get_width(draw.draw_buffer),
                      get_height(draw.draw_buffer),
                      dither_normal,
                      0,0
                        );

--当我直接将这个RENDER_TO_DRAWABLE()用到开始以后的过程时,结果出现访问异常。
      return false;
   end show;
  
   package show_callback is new Gtk.Handlers.Return_Callback
     (drawing_record,boolean);
   use show_callback;

   buf:gdk_pixbuf;
  
begin
   init;
   gtk_new(window);
   set_title(window,"Drawing-Test");
  
   Gtk.Widget.Push_Colormap (Gdk.Rgb.Get_Cmap);
   Initialize_Vbox (Draw, Homogeneous => False, Spacing => 0);--这个初始化不用,也出现访问异常。

   
   gdk_new_from_file(buf,"alps.png",error);
  
   if buf = Null_Pixbuf then
         put("NO PICTURE!");
         return;
      end if;
  
   draw.draw_buffer:=buf;
  
   gtk_new(draw.draw_area);
  
   object_connect(draw.draw_area,"expose_event",show'access,draw);
  
   Gtk.Widget.Pop_Colormap;
  
   add(window,draw);
   show_all(window);
  
   main;

   end draw;
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  

 



SUCCESS!

with Glib;              use Glib;
with Glib.Error;        use Glib.Error;
with Gtk.Box;           use Gtk.Box;
with Gtk.Drawing_Area;  use Gtk.Drawing_Area;
with Gdk.Pixbuf;        use Gdk.Pixbuf;
with Gtk.Handlers;      use Gtk.Handlers;
with Gtk.Style;         use Gtk.Style;
with Gtk.Widget;        use Gtk.Widget;
with Gdk.Rgb;           use Gdk.Rgb;
with gtk.window;use gtk.window;
with gtk.main;use gtk.main;
with gnat.io;use gnat.io;
procedure draw is
   
   window:gtk_window;
   
   error:Glib.Error.GError;
   
   type drawing_record is new gtk.box.gtk_box_record with record
      draw_area:gtk_drawing_area;
      draw_buffer:gdk_pixbuf;
   end record;
   
   type drawing is access all drawing_record'class;
   
   procedure gtk_new_draw(draw:out drawing;buf:gdk_pixbuf);
   
   package show_Cb is new Gtk.Handlers.Return_Callback
     (Drawing_Record, Boolean);
   
   function show(draw:access drawing_record'class)return boolean is
   begin
      render_to_drawable(draw.draw_buffer,
                      get_window(draw.draw_area),
                      Gtk.Style.Get_Black_Gc (Get_Style (Draw.draw_Area)),
                      0,0,0,0,
                      get_width(draw.draw_buffer),
                      get_height(draw.draw_buffer),
                      dither_normal,
                      0,0
                        );
      return false;
   end show;
   
   procedure gtk_new_draw(draw:out drawing;buf:gdk_pixbuf) is
   begin
      Gtk.Widget.Push_Colormap (Gdk.Rgb.Get_Cmap);
      draw:=new drawing_record;
      Initialize_Vbox (Draw, Homogeneous => False, Spacing => 0);
      draw.draw_buffer:=buf;
      Set_Usize
        (Draw,
         Get_Width (Draw.draw_buffer),
         Get_Height (Draw.draw_buffer));
      gtk_new(draw.draw_area);
      Pack_Start (Draw, Draw.draw_Area);
      
      show_cb.object_connect(draw.draw_area,"expose_event",show'access,draw);
      Gtk.Widget.Pop_Colormap;
      end gtk_new_draw;
   
   --package show_callback is new Gtk.Handlers.Return_Callback
     --(drawing_record,boolean);
   --use show_callback;
   buf:gdk_pixbuf;
   pic:drawing;
   vbox:gtk_box;
begin
   init;
   gtk_new(window);
   set_title(window,"Drawing-Test");
   Gtk_New_Vbox (Vbox, Homogeneous => False, Spacing => 0);
   
   gdk_new_from_file(buf,"alps.png",error);
   if buf = Null_Pixbuf then
         put("NO PICTURE!");
         return;
      end if;
   
   gtk_new_draw(pic,buf);
   pack_start(vbox,pic);
   add(window,vbox);
   show_all(window);
   
   main;
   end draw;

with gtk.frame;use

with gtk.frame;use gtk.frame;

with gtk.image;use gtk.image;

with gtk.main;use gtk.main;

with gtk.window;use gtk.window;

procedure draw_test2 is

win:gtk_window;

fr:gtk_frame;

image:gtk_image;

begin

init;

gtk_new(win);

gtk_new(fr);

gtk_new(image,"alps.png");

add(win,fr);

add(fr,image);

show_all(win);

main;

end draw_test2;