求助:关于GTKADA

目前正在用ada开发一个类似贪食蛇的游戏,初次接触gtkada,问题多多。哪位前辈高手能告诉我如何在界面上画图。 最简单的例子,在界面上用鼠标画点。然后再放一个点,这两点连成一线,通过依次用鼠标画点,连成一条长线.看了gtkada里面自带的例子还是不是很明白,关于鼠标事件。如何用鼠标作图。 哪里能找到这样的教程呢,,?谢谢

在线等待,,,,,

绘制一条直线

with gtk.window;use gtk.window;

with gdk.drawable;use gdk.drawable;

with gtk.style;use gtk.style;

with gtk.main;use gtk.main;

with glib.convert;use glib.convert;

with gtk.widget;use gtk.widget;

with gtk.handlers;use gtk.handlers;

procedure drawable_test is

type window_type is new gtk_window_record with record
window:gtk_window;
end record;

win: aliased window_type;

type win_access is access window_type'class;

package expose_cb is new Gtk.Handlers.Return_Callback
(window_type,boolean);
use expose_cb;

function expose(object:access window_type'class) return boolean is
begin

draw_line(get_window(object.window),get_black_gc(get_style(object.window)),20,30,300,350);
return true;
end expose;

begin

init;

gtk_new(win.window);

set_default_size(win.window,800,600);

set_title(win.window,locale_to_utf8("画图测试"));

object_connect(win.window,"expose_event",expose'access,win'access);

show(win.window);

main;

end drawable_test;

鼠标控制

在MOUSE的回调函数(或者过程)中加入

IF get_button(event)=1[左键] | 3[右键] | 2[中键(滑轮)] THEN

...

END IF;

该函数定义在GDK.EVENTS中 .

鼠标画点以及绘制连续线段

在 GTK.DRAWABLE 中定义了

procedure Draw_Point (Drawable : Gdk_Drawable; Gc : Gdk.Gdk_GC; X : Gint; Y : Gint);

procedure Draw_Points (Drawable : Gdk_Drawable; Gc : Gdk.Gdk_GC; Points : Gdk.Types.Gdk_Points_Array);

可以通过获取事件位置的方法获取鼠标位置来进行绘制 .以下是绘制方法,并不是完整的例子 .你可以根据以上

提供的绘制一条直线的程序进行适当修改 .

DRAWABLE:GTK_DRAWABLE;

POINT_NUMBER_LAST:NATURE:=1;

I:NATURE;

TYPE POINT IS RECORD
X:GINT;
Y:GINT;
END RECORD;

TYPE POINT_ARRAY IS ARRAY(1..POINT_NUMBER_LAST)OF POINT;

POINTS:POINT_ARRAY;

function Mouse_Press (
Obj : access Gtk_Drawing_Area_Record'Class;
Event : Gdk_Event)
return Boolean is

pragma Warnings(Off,Obj);

MOUSE_X:GINT;
MOUSE_Y:GINT;

begin
--Unrealize(Obj);
set_events(obj,button_press_mask);
if get_button(event)=1 then
Mouse_X:=Gint(Get_X(Event)); --GET MOUSE_PRESS POINT
Mouse_Y:=Gint(Get_Y(Event));
POINT_NUMBER_LAST:=POINT_NUMBER_LAST+1;
POINTS(I).X:=MOUSE_X;
POINTS(I).Y:=MOUSE_Y;
I:=I+1;

DRAW_POINT(DRAWABLE,GET_BLACK_GC(GET_STYLE(OBJ.WINDOW),MOUSE_X,MOUSE_Y);--绘制黑色的点

IF I-1>=1 THEN

FOR A IN 1..(I-1) LOOP

draw_line(DRAWABLE,get_black_gc(get_style(OBJ.window)),POINTS(A).X,POINTS(A).Y,POINTS(A+1).X,POINTS(A+1).Y);

END LOOP;
END IF;

END IF;
END;

完整的程序

 with gtk.drawing_area;use gtk.drawing_area;
with gtk.window;use gtk.window;
WITH GDK.EVENT;USE GDK.EVENT;
WITH GLIB;USE GLIB;

PACKAGE DRAW_SP5 IS

        PRESS_NUMBER:INTEGER:=0;
       
        MOUSE_X:GINT;  
        MOUSE_Y:GINT;

        POINT_NUMBER_LAST:NATURAL:=100; --点的上限

        TYPE POINT IS RECORD
              X:GINT;
              Y:GINT;
         END RECORD;

TYPE POINT_ARRAY IS ARRAY(1..POINT_NUMBER_LAST)OF POINT;

POINTS:POINT_ARRAY;

                WINDOW:GTK_WINDOW;    
                DRAWABLE:GTK_DRAWING_AREA;

FUNCTION MOUSE1_PRESS(OBJ:ACCESS GTK_DRAWING_AREA_RECORD'CLASS;
                                      EVENT:GDK_EVENT) RETURN BOOLEAN;

END DRAW_SP5;
 WITH GDK.EVENT;USE GDK.EVENT;
WITH GDK.DRAWABLE;USE GDK.DRAWABLE;
WITH GTK.STYLE;USE GTK.STYLE;
WITH GNAT.IO;USE GNAT.IO;

PACKAGE BODY DRAW_SP5 IS

FUNCTION MOUSE1_PRESS(OBJ:ACCESS GTK_DRAWING_AREA_RECORD'CLASS;
                                       EVENT:GDK_EVENT) RETURN BOOLEAN IS

PRAGMA WARNINGS(OFF,OBJ);
PRAGMA WARNINGS(OFF);

begin

if get_button(event)=1 then

    PRESS_NUMBER:=PRESS_NUMBER+1;  
   
   PUT(INTEGER(Get_X(Event)));

   Mouse_X:=Gint(Get_X(Event)); --GET MOUSE_PRESS POINT
   Mouse_Y:=Gint(Get_Y(Event));
   
   POINTS(PRESS_NUMBER).X:=MOUSE_X;
   POINTS(PRESS_NUMBER).Y:=MOUSE_Y;
   

IF PRESS_NUMBER=1 THEN

DRAW_POINT(GET_WINDOW(DRAWABLE),GET_BLACK_GC(GET_STYLE(WINDOW)),POINTS(1).X,POINTS(1).Y);

ELSIF PRESS_NUMBER>1 THEN

FOR A IN 1..PRESS_NUMBER-1 LOOP

draw_line(GET_WINDOW(DRAWABLE),get_black_gc(get_style(WINDOW)),POINTS(A).X,POINTS(A).Y,POINTS(A+1).X,POINTS(A+1).Y);

END LOOP;

end if;

END IF;

RETURN FALSE;

END MOUSE1_PRESS;

END DRAW_SP5;

 WITH GTK.WINDOW;USE GTK.WINDOW;
WITH GTK.DRAWING_AREA;USE GTK.DRAWING_AREA;
WITH GTK.STYLE;USE GTK.STYLE;
WITH GTK.MAIN;USE GTK.MAIN;
WITH GTK.HANDLERS;USE GTK.HANDLERS;
WITH GDK.EVENT;USE GDK.EVENT;

WITH DRAW_SP5;USE DRAW_SP5;

PROCEDURE MAIN_win IS

  package mouse_press_cb is new gtk.handlers.return_callback(GTK_DRAWING_AREA_RECORD,boolean);


   use Mouse_press_Cb;
   
  BEGIN
  
       INIT;
       
       GTK_NEW(WINDOW);

       SET_SIZE_REQUEST(WINDOW,800,600);

       SET_RESIZEABLE(WINDOW,FALSE);

       GTK_NEW(DRAWABLE);

       ADD(WINDOW,DRAWABLE);


       Set_Events(DRAWABLE,Button_Press_Mask);


       Mouse_press_Cb.Connect(DRAWABLE,"button_press_event",
                                          MOUSE_PRESS_CB.TO_MARSHALLER(Mouse1_press'access),TRUE);

       SHOW_ALL(WINDOW);
       
       MAIN;

END MAIN_win;