Разбираемся с GtkAda

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
x0123456789
Сообщения: 8
Зарегистрирован: 10 июн 2009, 13:02

Народ!
На GtkAda пытаюсь по таймеру раз в секунду вызвать обновление клиенской области окна. Хочу получить такой же эффект как при выполнении функции Invalidate() в Windows API.
Сначала пошёл по наиболее логичному пути посредством Emit_by_Name() см. функцию Timer1(). Действительно, Expose_Event() получает управление, но после выполнения своего return-а валится.
Есть подозрение, что неправильно передаю параметр Drawing_Area.
В конце-концов удалось решить пороблему посредством Gdk.Window.Invalidate_Rect() см. функцию Timer2(). Работает, но как-то всё это через ж.
Вопрос: Чего я не догоняю?
(Язык Ada - вставил для поисковика).

Код: Выделить всё

procedure GtkTest is
   Window: Gtk.Window.Gtk_Window;
   Drawing_Area: Gtk.Drawing_Area.Gtk_Drawing_Area;
   tim_cnt: integer := 0;
   Timeout_id: Gtk.Main.Timeout_Handler_Id := 0;

package Configured is new Gtk.Handlers.Return_Callback   
   (Gtk.Drawing_Area.Gtk_Drawing_Area_Record, boolean);

package Timeout is new Gtk.Main.Timeout (integer);

...

function Expose_Event (
   Drawing_Area: access Gtk.Drawing_Area.Gtk_Drawing_Area_Record'Class;
   Event: in Gdk.Event.Gdk_Event) return Boolean
is
   da : Gdk.Drawable.Gdk_Drawable;
   gc : Gdk.Gdk_GC;
begin
   da := Gtk.Drawing_Area.Get_Window (Drawing_Area);
   gc := Gtk.Style.Get_Fg_GC (Gtk.Drawing_Area.Get_Style (Drawing_Area),  Gtk.Enums.State_Normal);
   Gdk.Drawable.Draw_Point (da, gc, Gint (tim_cnt), Gint (tim_cnt));
   tim_cnt := tim_cnt + 1;
   return false;
end Expose_Event;

-- не работает	
function Timer1 (t : integer) return boolean is
begin
   return Configured.Emit_by_Name (Drawing_Area, "expose_event");
end Timer;

-- работает
function Timer2 (t : integer) return boolean is
begin
   Gdk.Window.Invalidate_Rect (Gtk.Drawing_Area.Get_Window (Drawing_Area), Gdk.Rectangle.Gdk_Rectangle'(0,0,256,256), true);
   return true;
end Timer;

begin
   ...
   Configured.Connect (Drawing_Area, "expose_event", 
   Configured.To_Marshaller (Expose_Event'Access));
   -- Timeout_id := Timeout.Add (1000, Timer1'access, tim_cnt); 
   Timeout_id := Timeout.Add (1000, Timer2'access, tim_cnt);
   ...
end GtkTest;
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Программирую под W32 в основном на C++. Пару месяцев назад скачал GNAT Ada и начал осваивать. Часто по роду работы приходится моделировать разные процессы. Для этого теперь использую AD-у. В большинстве случаев хватает консольного режима работы. Но иногда в при выполнении ADA-программы появляется необходимость отображать результаты в виде графиков. Для работы с графикой имеются пакеты GtkAda и QtAda. Хотя раньше немного и был знаком с Qt на C++ на AD-e решил начать с Gtk++. Вот теперь мучаюсь...
Ответить