GTK+图形化应用程序开发学习笔记(三)—窗体(2)

五、回调函数

       由于程序必须能够对用户的操作做出相应,在基于GUI的程序设计中信号是必要的。移动鼠标,按下按钮,敲入正文或者关闭窗口,将给应用软件的回呼函数提供信号。信号可能需要应用软件来加以处理。如:字处理软件有使字体变黑的按钮。如果用户按下了按钮,就需要调用使字体变黑的程序。与此类型,如果用户关闭了主窗口,在实际关闭窗口以前要进行某些处理(如保存文件,清除等)。

       GTK+中经常产生各种信号,多数情况下信号被忽略。以按钮构件为例,应用软件有专门用于按钮的信号。当用户按下鼠标或释放鼠标按钮时,当用户电机鼠标时,或者当鼠标移过按钮或离开按钮时都产生各自的信号。应用程序可以忽略掉一些信号,只对感兴趣的事件加以处理。

       当需要对信号进行处理时,需要用GTK+登记回调函数,并将它和构件联系在一起。构件可以登记回调函数,回调函数可与多个构件联系在一起。

 

6.

名称:

g_signal_connect

功能

信号登记函数

头文件

#include <gtk/gtk.h>

函数原形

gulong g_signal_connect(gpointer *object,const gchar *name,GCallback func,gpointer data);

参数

object    发出信号的控件

name     信号名称

func      回调函数(对信号要采取的动作)

data      传给回调函数的数据

返回值

 

      

 

 

 

 

 

 

 

 

 

 

 

 

 

g_signal_connect用于登记一个GTK+信号,其功能有点像普通信号登记函数signal.当某个空间发出信号,程序就会去执行由g_signal_connect登记的回调函数。

      

下面我们把上面的程序稍微改动一下,使它可以正常退出。

  1. /*base2.c*/
  2. #include <gtk/gtk.h>
  3.                                                                                                                                              
  4. int main(int argc, char* argv[])
  5. {
  6. GtkWidget *window;
  7.     gtk_init(&argc,&argv);
  8. window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  9. g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
  10.     gtk_widget_show(window);
  11.     gtk_main();
  12.     return FALSE;
  13. }

$ gcc -o base2 base2.c 'pkg-config --cflags --libs gtk+-2.0'

       $./base2

 

       其中destroyGTK+最基本信号之一,当关闭窗口时,发出该信号。还有一个是delete_event, 当将要关闭窗口时,发出该信号。

程序中添加了gtk_signal_connect函数,当用户关闭窗口时gtk_signel_connect函数调用gtk_main_quit函数来关闭程序。

       大家也可以编写回调函数,在回调函数里结束程序。这样做的好处是当用户试图退出一个程序时,程序可以提示你是否真的退出。

       自己编写回调函数的程序例子:

  1. /*base2.c*/
  2. #include <gtk/gtk.h>
  3. ginit destroy(GtkWidget *,gpointer)
  4.                                                                                                                                            
  5. int main(int argc, char* argv[])
  6. {
  7. GtkWidget *window;
  8.     gtk_init(&argc,&argv);
  9. window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  10. g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(destroy),NULL);
  11.     gtk_widget_show(window);
  12.     gtk_main();
  13.     return 0;
  14. }
  15. ginit destroy(GtkWidget *widget,gpointer gdata)
  16. {
  17. g_print(“Quitting!/n”);
  18. gtk_main_quit();
  19. return(FALSE);
  20. }

$ gcc -o base3 base3.c 'pkg-config --cflags --libs gtk+-2.0'

       $./base3

 

注意,当关闭窗口时,将在启动应用程序的控制台上显示Quitting消息。这是由回调函数显示的。

 

从上面的程序可以看到,g_signal_connect对应的回调函数形式为ginit destroy(GtkWidget *widget,gpointer gdata)有两个参数。GTK+还有一个信号登记函数。g_signal_connect_swapped.,它的作用和gtk_signal_connect相同。不同的是g_signal_connect_swapped.对应的回调函数只有一个参数,形式为ginit destroy(GtkWidget *widget)。是因为GTK+有一些只接收一个参数的函数(比如gtk_widget_destroy)

 

 

7.

名称:

g_signal_connect_swapped

功能

信号登记函数

头文件

#include <gtk/gtk.h>

函数原形

gulong g_signal_connect_swapped(gpointer *object,const gchar *name,GCallback func,gpointer *widget);

参数

object    发出信号的控件

name     信号名称

func      回调函数(对信号要采取的动作)

winget    传给回调函数的数据

返回值

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

六、其它窗体函数

       在上面我们已经介绍了怎样去建立一个窗体,下面我们来介绍其它的窗体函数。

8

名称:

gtk_window_set_title

功能

修改窗体标题

头文件

#include <gtk/gtk.h>

函数原形

void gtk_window_set_title(GtkWindow *window,const gchar *title);

参数

window   窗体名

title      窗体标题

返回值

      

 

 

 

 

 

 

 

 

gtk_window_set_title函数可以修改程序的标题。窗口的标题会出现在标题栏中。在X窗体系统中,标题栏被窗体管理器管理,并由程序员指定。标题应该帮助用户区分当前窗体与其它窗体。

       如果我们想把一个程序的标题修改为“Main Window”.我们可在程序中加入

       gtk_window_set_title(GTK_WINDOW(window),”Main Window”);

 

9.

名称:

gtk_window_set_resizable

gtk_window_get_resizable

功能

获得/修改窗体的伸缩属性

头文件

#include <gtk/gtk.h>

函数原形

void gtk_window_set_resizable(GtkWindow *window,gboolean resizable);

gboolean gtk_window_get_resizable(GtkWindow *window);

参数

window         窗体名

resizable        窗体是否可以伸缩

返回值

无( gtk_window_set_resizable

如果可以伸缩为TRUE,如果不可以伸缩为FALSE gtk_window_get_resizable

      

 

 

 

 

 

 

 

 

 

 

 

 

 

 

gtk_window_get_resizable可以获得窗体的伸缩属性,系统默认窗体是可伸缩的。gtk_window_get_resizable有一个返回值,如果可以伸缩为TRUE,如果不可以伸缩为FALSE

       gtk_window_set_resizable 可以修改窗体的伸缩属性,由第二参数指定。

       如果我们想把一个窗体指定为不可伸缩的我们可以在程序中添加:

       gtk_window_set_resizable(GTK_WINDOW(window),FALSE);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值