На 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++. Вот теперь мучаюсь...