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;

----------------

Спасибо!

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

Hello!

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

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

Handlers.Connect

(DrawBuffer ,

"clicked",

Handlers.To_Marshaller (Get_Mouse_Pos'Access)

);

On 09/09/2016 13:42, cs_a994@yahoo.com mailto:cs_a994@yahoo.com [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

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