cairo上下文上的鼠标事件

Mouse events on a cairo context

本文关键字:鼠标 事件 上下文 cairo      更新时间:2023-10-16

我正在用C++和GTK3开发一个应用程序,但我被卡住了。我用glade创建了一个可视化应用程序,它有三列,其中一列,中间一列,是DrawingArea。在DrawingArea中,我想在按下按钮后在我想要的点上画一些圆圈,并在这些圆圈上有不同的鼠标事件(如拖放、双击、右键单击…)。我已经根据官方文档做了第一件事(按下按钮后画一个圆圈),但问题是我不知道如何做鼠标事件,但我想了想,我有一些不同的解决方案(我不知道它们是最好的解决方案还是更好的):

  1. 我认为最好的方法是创建一个到cairomm上下文的信号,但我没有看到任何方法。也许方法是创建一个开罗表面或类似的东西。

  2. 每次我点击创建一个圆圈时,我都必须创建一个gtk小部件,在其中我可以处理鼠标事件。这里的问题是小部件需要具有圆形,并且需要是可绘制的。是否可以创建一个圆形绘图区域?这可能是最好的。我在这里看到了创建自定义小部件的方法。

  3. 使用goocanvasmm。这里的问题是,goocanvasmm有一些文档(很抱歉,由于我的声誉,我不能发布两个以上的链接),我认为这不是最好的解决方案,我更喜欢使用cairomm。

这个应用程序是用GTK2用C编写的,圆圈是用gnomecanvas绘制的,以一种简单的方式将信号添加到每个圆圈中;现在我将这个应用程序转移到C++和GTK3来更新它

我对GTK(以及一般的图形界面)很陌生,但我找了几个小时的解决方案,我不知道什么是继续工作的最佳方式。

感谢您的帮助:)

最好使用画布库,例如GooCanvas。单独使用cairo执行此操作需要您在整个绘图区域中侦听鼠标事件,并跟踪圆圈的位置,以便决定鼠标事件属于哪个圆圈——这正是画布库已经为您解决的问题。

如果您在使用goocanvasmm文档时遇到问题,请查看GooCanvas的C API文档,并结合C API如何转换为C++的知识,通常就足够了。尽管GooCanvasmm文档对我来说似乎相当广泛。