在Cairo上进行鼠标事件

3
我正在使用C++和GTK3开发一个应用程序,但是遇到了困难。我使用glade创建了一个可视化应用程序,其中有三列,其中一个是中间的DrawingArea。在那个DrawingArea中,我想在按下按钮后在想要的位置绘制一些圆,并在这些圆上具有不同的鼠标事件(如拖放、双击、右键单击...)。我已经完成了第一件事(按下按钮后绘制一个圆),按照官方文档,但问题是我不知道如何处理鼠标事件,但我考虑了一些不同的解决方案(我不知道它们是否是最好的解决方案,或者可能有更好的解决方案):
  1. 我认为最好的方法是创建一个信号到cairomm上下文,但我没有看到任何可以这样做的东西。也许方法是创建一个cairo表面或类似的东西。

  2. 每次我点击创建一个圆圈时,我需要创建一个gtk小部件来处理鼠标事件。问题在于小部件需要具有圆形形状并且可绘制。是否可能创建一个圆形DrawingArea?那可能是最好的。我看到了创建自定义小部件的方法here

  3. 使用goocanvasmm。问题在于goocanvasmm文档很少(由于我的声望,我不能发布超过两个链接),我认为这不是最好的解决方案,我更喜欢使用cairomm。

这个应用程序是使用GTK2和C编写的,圆圈是使用gnomecanvas绘制的,很容易地向每个圆圈添加信号;现在我正在将这个应用程序移植到C++和GTK3以进行更新。

我对GTK(和图形界面一般)非常陌生,但我已经寻找了几个小时的解决方案,不知道继续工作的最佳方法是什么。
谢谢你的帮助 :)
1个回答

1

最好使用像GooCanvas这样的画布库。仅使用cairo需要监听整个绘图区域上的鼠标事件,并跟踪圆的位置以确定鼠标事件属于哪个圆——正是画布库已经为您解决的问题。

如果你在使用goocanvasmm文档时遇到了麻烦,查看GooCanvas的C API文档,并了解C API如何转换为C ++通常就足够了。尽管GooCanvasmm文档对我来说似乎相当全面。


谢谢ptomato!我忘了在这里发布消息,最终我使用goocanvasmm完成了它;这是最好、最简单和实用的解决方案 :) - bmenendez
2
对于在2015年之后看到这篇答案的读者,很遗憾,goocanvas库已经不再维护了。 - oz123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接