Ada_Ru форум

Обсуждение языка Ада

GtkAda: как получить к оординаты курсора мыши?

Оставить новое сообщение

Сообщения

cs_a994
GtkAda: как получить к оординаты курсора мыши?
2016-09-06 22:27:41
В имеющуюся программу надо вставить получение координат курсора по нажатию на кнопку мыши. По
имеющимся примерам не понимаю, как это сделать. А именно не понимаю с каким объектом связать это
самое нажатие. С кнопкой ( Gtk_Button ) всё было б ясно, но у меня область вывода (
Double_Buffer.Gtk_Double_Buffer ).

Структура программы примерно такова:

Основная программа создаёт обработчики событий, запускает Gtk, запускает основную обработку данных.
В Главном окне есть область, где программа рисует. Вокруг, как положено, всякие кнопочки. Нужно
получить координаты курсора из области рисования по щелчку мыши.

Фрагмент спецификации Главного окна:
----------------
package Main_Window_Pkg is

   type Window_Record is new Gtk_Window_Record with record
      Vbox1 : Gtk_Vbox;
      Hbox1 : Gtk_Hbox;
      Next_Button : Gtk_Button;
      Select_Button : Gtk_Button;
.........
      Progress : Gtk_Progress_Bar;
   end record;
   type Window_Access is access all Window_Record'Class;

   procedure Gtk_New (Window : out Window_Access);
   procedure Initialize (Window : access Window_Record'Class);

   Gdkw : Gdk.Window.Gdk_Window;
   GC_Back   : Gdk.GC.Gdk_GC;
   WndwRec : Window_Access;

   -- Область рисования программы
   DrawBuffer : Double_Buffer.Gtk_Double_Buffer;
............
----------------
Фрагмент тела главного окна, где определяется область рисования:
----------------
...............
      Gtk_New_Hbox (Window.Hbox1, False, 0);

      Double_Buffer.Gtk_New (DrawBuffer);
      Double_Buffer.Set_USize (DrawBuffer, wBufImgSize, hBufImgSize);
      Double_Buffer.Set_Back_Store (DrawBuffer, True);
      Pack_Start
        (Window.Hbox1,
         DrawBuffer,
         Expand  => False,
         Fill    => True,
         Padding => 0);
............
----------------
Фрагмент основной программы:
----------------
procedure GM_Simulator is
..............
   procedure Clicked_Next (Widget : access Gtk_Widget_Record'Class) is
   begin
      Phy_Buttons.Set_Buttons_State (Phy_Buttons.Next_Pressed);
   end Clicked_Next;

   --  Мой обработчик
   procedure Get_Mouse_Pos
      (Widget           : access Gtk_Widget_Record'Class)
   --  Get the mouse poiter position by a click
   is
   begin --  Get_Mouse_Pos
      Phy_Touch_Screen.Update_Touch_Screen;
   end Get_Mouse_Pos;
................
begin --  GM_Simulator
................
   Gtk.Main.Set_Locale;
   Gtk.Main.Init;
   Gtk_New (Main_Window);
   Show_All (Main_Window);
.................
   Handlers.Connect
     (Main_Window,
      "destroy",
      Handlers.To_Marshaller (Destroy'Access)
     );

--  Заготовка для моего обработчика
--   Handlers.Connect
--     (   ,
--      "clicked",
--      Handlers.To_Marshaller (Get_Mouse_Pos'Access)
--     );

   Handlers.Connect
     (Main_Window.Next_Button,
      "clicked",
      Handlers.To_Marshaller (Clicked_Next'Access)
     );
..................
   Gtk.Widget.Set_Sensitive (Gtk.Widget.Gtk_Widget (Main_Window.GoToWayBtn), False);
   Gtk.Widget.Set_Sensitive (Gtk.Widget.Gtk_Widget (Main_Window.GoToSurfBtn), False);
   Gtk.Widget.Set_Sensitive (Gtk.Widget.Gtk_Widget (Main_Window.TabWidget), False);
.................. 
   Gtk.Main.Main;

end GM_Simulator;
----------------

Спасибо!
kazakov1961
Re: GtkAda: как получить к оординаты курсора мыши?
2016-09-06 23:41:35
   function On_Button_Press 
            (  Object : access GObject_Record'Class; 
               Event  : Gdk_Event; 
               Data   : ... 
            )  return Boolean is 
      Where : Cairo_Tuple; 
   begin 
      ... 
      Get_Coords (Event, Where.X, Where.Y); 
      ... 
      return True; 
   end On_Button_Press; 
 
-- 
Regards, 
Dmitry A. Kazakov 
Dmitry Kazakov's home page http://www.dmitry-kazakov.de 
 
 http://www.dmitry-kazakov.de 
 
 Dmitry Kazakov's home page http://www.dmitry-kazakov.de        Artificial intelligence       World
Map Pattern matching, text processing, compilation   Reusable free code   Unofficial album covers
of wonderful mus...
 
 
 
 View on www.dmitry-kazakov.de http://www.dmitry-kazakov.de 
 Preview by Yahoo 
 
 
  
cs_a994
Re: GtkAda: как получить к оординаты курсора мыши?
2016-09-08 21:42:16
Hello!

Спасибо. Но это не то, что нужно. Собственно именно это и так было понятно.

Вопрос в том к чему привязывать данное действие? Выражаясь в терминах этой функции что должно
выступать в роли Object ? У меня при попытке подставить область рисования программа уходит в
бесконечный цикл ещё до вызова обработчика:

   Handlers.Connect
     (DrawBuffer ,
      "clicked",
      Handlers.To_Marshaller (Get_Mouse_Pos'Access)
     );
kazakov1961
Re: GtkAda: как получить к оординаты курсора мыши?
2016-09-08 23:52:39
On 09/09/2016 13:42, [email protected] mailto:[email protected] [ada_ru] wrote: 
 
 Спасибо. Но это не то, что нужно. Собственно именно это и так было понятно. 
 
Вопрос в том к чему привязывать данное действие? Выражаясь в 
терминах  этой функции что должно выступать в роли Object ? 
 
Widget, Drawing Area, к примеру. Пример рисования и обработки mouse events:

http://www.dmitry-kazakov.de/ada/aicwl.htm#1.6 http://www.dmitry-kazakov.de/ada/aicwl.htm#1.6
 
 У меня при попытке 
подставить область рисования программа уходит в бесконечный цикл ещё до 
вызова обработчика: 
 
   Handlers.Connect 
     (DrawBuffer , 
      "clicked", 
      Handlers.To_Marshaller (Get_Mouse_Pos'Access) 
     ); 
 
DrawBuffer - это не Widget (Gtk_Widget_Record). Кнопки мыши генерируют button_press_event a не
clicked.
 
-- 
Regards, 
Dmitry A. Kazakov 
Dmitry Kazakov's home page http://www.dmitry-kazakov.de 
 
 http://www.dmitry-kazakov.de 
 
 Dmitry Kazakov's home page http://www.dmitry-kazakov.de        Artificial intelligence       World
Map Pattern matching, text processing, compilation   Reusable free code   Unofficial album covers
of wonderful mus...
 
 
 
 View on www.dmitry-kazakov.de http://www.dmitry-kazakov.de 
 Preview by Yahoo 
 
 
  
Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти