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;
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 isnew gtk.handlers.return_callback(GTK_DRAWING_AREA_RECORD,boolean);
绘制一条直线
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;