本节将介绍如何使用事件盒控件、处理事件盒控件的信号和在程序中启动浏览器。我们在编程时为了便于和使用者联系或让使用者查到某些方面的资料,一般在界面中加入一个按钮、图像或标签控件,使用者用鼠标单击此控件后会启动浏览器,自动打开 URL链接。用 GTK+实现此功能要用到事件盒(GtkEventBox)控件。因为标签和图像一般不能直接接收外部的鼠标事件,将它们放入到事件盒中后,就可以利用事件盒的可接收外部鼠标事件的特性来处理鼠标事件了。
#include
static gboolean button_press_callback(GtkWidget * event_box, GdkEventButton * event, gpointer data)
{
if(event->button == 1) //判断是否为鼠标左键
system("google-chrome ");
return TRUE;
}
int main(int argc, char * argv[])
{
GtkWidget * window;
GtkWidget * vbox;
GtkWidget * hbox;
GtkWidget * label;
GtkWidget * image;
GtkWidget * eventbox;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
gtk_window_set_title(GTK_WINDOW(window), "URL链接");
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);
label = gtk_label_new("以下为两种形式的超链接:");
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 5);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
eventbox = gtk_event_box_new();
g_signal_connect(G_OBJECT(eventbox), "button_press_event", G_CALLBACK(button_press_callback), image);
gtk_box_pack_start(GTK_BOX(hbox), eventbox, FALSE, FALSE, 15);
label = gtk_label_new("打开百度搜索......");
gtk_container_add(GTK_CONTAINER(eventbox), label);
eventbox = gtk_event_box_new();
g_signal_connect(G_OBJECT(eventbox), "button_press_event", G_CALLBACK(button_press_callback), image);
gtk_box_pack_start(GTK_BOX(hbox), eventbox, FALSE, FALSE, 15);
image = gtk_image_new_from_file("01.gif");
gtk_container_add(GTK_CONTAINER(eventbox), image);
gtk_widget_show_all(window);
gtk_main();
return FALSE;
}
运行结果:
当鼠标点击文本标签或者图片都可以用浏览器打开百度搜索。
代码分析:
(1) 事件盒的信号
事件盒的主要用途是为不具有自己窗口的控件来捕获事件的,它具有 GtkWidget 的所有信号类型。这里连接的是“key_press_event”,即单击鼠标信号,此信号的回调函数的第 2 个参数为GdkEventButton 结构类型,用于存贮鼠标按下时的事件信息,其中的成员button 为整型,表示鼠标哪一个键按下了,其中 1 为左键、2 为中键、3 为右键。
另外,此回调函数是有返回类型的,返回 TRUE 表示已经接收到事件,所以信号就不会发射了;返回 FALSE 则继续调用回调函数。
相关的其他事件信号感兴趣的可以自行查看帮助文档。
标签: GTK
②文章观点仅代表原作者本人不代表本站立场,并不完全代表本站赞同其观点和对其真实性负责。
③文章版权归原作者所有,部分转载文章仅为传播更多信息、受益服务用户之目的,如信息标记有误,请联系站长修正。
④本站一律禁止以任何方式发布或转载任何违法违规的相关信息,如发现本站上有涉嫌侵权/违规及任何不妥的内容,请第一时间反馈。发送邮件到 88667178@qq.com,经核实立即修正或删除。