2007年3月6日星期二

Signal & Event

是不是觉得 HelloWorld 的程序有点问题? 按了关闭窗口的按钮但程序还不结束, 是因为它对关闭窗口的所产生的信号还没进行处理, 主循环还继续执行着.
先了解一下信号和事件吧.
什么是信号? 信号是用时和程序在交互的过程中由相应的信号处理程序产生的, 称 X 信号.
什么是事件? 事件是 GTK+ 解释来自 X 信号而出现的.
GTK+ 以这两种方式来响应用户动作, 但 GTK+ 程序员可以用相同的方式处理信号和事件.

简单的程序, 代码说明一切...

/**
* 信号和事件
*/

#include <gtk/gtk.h>

// 关闭应用程序的信号处理
void CloseTheApp ( GtkWidget * window, gpointer data ) {
// 停止主循环
gtk_main_quit ();
}

// 窗口的事件处理
// 当窗口产生任何类型的事件是调用此函数, 这里只对部分事件作出响应.
gboolean EventHandler ( GtkWidget * window, GdkEvent * event, gpointer data ) {
switch ( event -> type ) {
case GDK_CONFIGURE:
g_print ( "The window is being reconfigured.\n" );
break;
case GDK_EXPOSE:
g_print ( "The window contents were redrawn.\n" );
break;
case GDK_ENTER_NOTIFY:
g_print ( "The mouse entered the window.\n" );
break;
case GDK_LEAVE_NOTIFY:
g_print ( "The mouse left the window.\n" );
break;
case GDK_DELETE:
g_print ( "Uh oh~ the user killed the window.\n" );
break;
default:
break;
}
return FALSE;
}

int main ( int argc, char *argv[] ) {
GtkWidget * window;

gtk_init ( &argc, &amp;argv );

window = gtk_window_new ( GTK_WINDOW_TOPLEVEL );
gtk_window_set_title( GTK_WINDOW ( window ), "Signal & Event" );

// 窗口连接到 "窗口关闭" 信号产生时的回调函数
gtk_signal_connect ( GTK_OBJECT ( window ),
"destroy", // destroy 是关闭窗口是产生的信号
GTK_SIGNAL_FUNC ( CloseTheApp ),
NULL ); // 最后一个参数是传递给信号处理函数的某个数据的指针

// 窗口连接到窗口事件产生时的回调函数
gtk_signal_connect ( GTK_OBJECT ( window ),
"event", // event 是指定部件产生的任何事件
GTK_SIGNAL_FUNC ( EventHandler ),
NULL );

gtk_widget_show( window );

gtk_main ();
return 0;
}

下面是 GDK 参考手册上的事件说明:

没有评论: