События мыши в контексте cairo

Я разрабатываю приложение с C++ и GTK3, но я застрял. Я создал визуальное приложение с поляной, состоящей из трех столбцов, и один из них, средний, представляет собой область рисования. В этом DrawingArea я хочу нарисовать несколько кругов в нужной мне точке после нажатия кнопки и иметь различные события мыши на этих кругах (например, перетаскивание, двойной щелчок, щелчок правой кнопкой мыши...). Я сделал первое (нарисовал круг после нажатия кнопки), следуя официальная документация, но проблема в том, что я не знаю, как делать события мыши, но я думал об этом, и у меня есть несколько разных решений (я не знаю, являются ли они лучшими решениями или, может быть, есть лучше):

  1. Я думаю, что лучший способ - создать сигнал для контекста cairomm, но я не видел ничего, чтобы сделать это. Может быть, стоит создать поверхность cairo или что-то в этом роде.

  2. Каждый раз, когда я нажимаю, чтобы создать круг, мне приходится создавать виджет gtk, в котором я могу обрабатывать события мыши. Проблема здесь в том, что виджет должен иметь круглую форму и должен быть доступен для рисования. Можно ли создать круговую область рисования? Это может быть лучшим. Я увидел способ создания пользовательских виджетов здесь .

  3. Используйте goocanvasmm. Проблема здесь в том, что у goocanvasmm мало документации (извините, я не могу разместить больше двух ссылок из-за своей репутации) и я думаю, что это не лучшее решение, я предпочитаю использовать cairomm.

Это приложение было написано на C с использованием GTK2, а круги были нарисованы с помощью gnomecanvas, с простым добавлением сигналов к каждому кругу; и теперь я перемещаю это приложение на C++ и GTK3, чтобы обновить его.

Я очень новичок в GTK (и в графических интерфейсах в целом), но я часами искал решения и не знаю, как лучше всего продолжить свою работу.

Спасибо за помощь :)


person bmenendez    schedule 28.06.2013    source источник


Ответы (1)


Для этого лучше всего использовать библиотеку холстов, например GooCanvas. Выполнение этого только с помощью cairo потребует от вас прослушивания событий мыши во всей области рисования и отслеживания того, где были круги, чтобы решить, к какому кругу относится событие мыши - именно та проблема, для которой уже решена библиотека холста. ты.

Если у вас возникли проблемы с документацией goocanvasmm, ознакомьтесь с документацией по API GooCanvas C в сочетании со знанием того, как C API транслируется в C++, обычно бывает достаточно. Хотя документация GooCanvasmm кажется мне довольно обширной.

person ptomato    schedule 06.07.2013
comment
Спасибо, помидор! Я забыл опубликовать здесь, что, наконец, я делаю это с помощью goocanvasmm; это лучшее, простое и практичное решение :) - person bmenendez; 07.07.2013
comment
Для читателей, которые увидят этот ответ после 2015 года, библиотека goocanvas больше не поддерживается... К сожалению. - person oz123; 19.08.2016