C 在GTK+;3、如何获得绘图区域以响应鼠标事件?

C 在GTK+;3、如何获得绘图区域以响应鼠标事件?,c,mouseevent,gtk3,drawingarea,C,Mouseevent,Gtk3,Drawingarea,在GTK+3中,如何获得绘图区域以响应鼠标事件 在main()函数中,我声明了我的绘图区域: GtkWidget *drawing_area; 然后,我用鼠标点击信号连接了绘图区域: g_signal_connect(drawing_area, "button-press-event", G_CALLBACK(clicked), NULL); “单击”功能的定义如下: static gboolean clicked(GtkWidget *widget, GdkEventButton *eve

在GTK+3中,如何获得绘图区域以响应鼠标事件

main()函数中,我声明了我的绘图区域:

GtkWidget *drawing_area;
然后,我用鼠标点击信号连接了绘图区域

g_signal_connect(drawing_area, "button-press-event", G_CALLBACK(clicked), NULL);
“单击”功能的定义如下:

static gboolean clicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data)

    printf("Clicked! \n");

    return TRUE;
}

程序运行并显示绘图区域,但当我单击它时,没有回答,什么也没有发生!为什么会发生这种情况?

似乎GtkDrawingArea默认情况下无法接收鼠标事件

请看一下:

要在绘图区域上接收鼠标事件,需要启用 使用gtk_widget_add_events()添加它们。要接收键盘事件,请 需要在绘图区域上设置“可聚焦”属性,然后 可能会绘制一些用户可见的指示 这一领域是有重点的。在曝光事件中使用gtk_widget_has_focus() 处理程序来决定是否绘制焦点指示器。看见 gtk_render_focus()用于绘制焦点的一种方法

或者尝试将事件
“按钮按下事件”
连接到窗口:

g_signal_connect(window, "button-press-event", G_CALLBACK(clicked), NULL);
而不是

g_signal_connect(drawing_area, "button-press-event", G_CALLBACK(clicked), NULL);
如本例所示:

一个完整的例子是:


它通过::button press和::motion notify处理程序演示输入事件处理。

这很有效,但不是很好,因为我的绘图区域嵌入到GUI中,因此无论我在GUI窗口中的何处单击(即使在绘图区域之外),都会处理单击事件。我只希望鼠标事件只在我在绘图区域中单击时处理,而不是在其他地方!谢谢,现在可以用了。我添加了gtk_小部件_添加_事件(绘图区、GDK_按钮_按下_掩码);要添加鼠标点击和鼠标运动事件:gtk_小部件_设置_事件(绘图区、gtk_小部件_获取_事件(绘图区)| GDK_按钮|按下|遮罩| GDK_指针|运动|遮罩);