高手帮忙看看什么问题
以下是关于在窗口上显示一幅画面的简短程序,可问题是图片显示不出来,高手请帮忙!
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;