В имеющуюся программу надо вставить получение координат курсора по нажатию на кнопку мыши. По имеющимся примерам не понимаю, как это сделать. А именно не понимаю с каким объектом связать это самое нажатие. С кнопкой ( 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, [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
Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти