曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 10358|回复: 2

从 “hello world”开始

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
发表于 2009-8-7 15:12:58 | 显示全部楼层 |阅读模式
程序代码
#include <gtk/gtk.h>

/*定义回调函数,单击按钮时系统自动调用*/
void hello (GtkWidget *widget, gpointer *data)
{
        g_print ("button clicked and data = %s\n", (char *)data);
}

/*定义回调函数destroy,关闭窗口时系统自动调用*/
void destroy(GtkWidget *widget, gpointer *data)
{
        gtk_main_quit();
}

int main (int argc, char **argv)
{
        /*定义指向控件的指针*/
        GtkWidget       *window;
        GtkWidget       *button;

        /*初始化图形显示环境*/
        gtk_init (&argc, &argv);

        /*创建窗口,并设置当关闭窗口时,要执行的会调函数*/
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        g_signal_connect (GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(destroy), NULL);

        /*设置窗口的属性*/
        gtk_container_border_width (GTK_CONTAINER(window), 80);

        /*创建按钮,并设置按钮上的文字*/
        button = gtk_button_new_with_label("hello world");

        /*设置当单击按钮时,要执行的回调函数*/
        g_signal_connect (GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(hello), "I love you");

        /*将按钮加入到窗口中*/
        gtk_container_add (GTK_CONTAINER(window), button);

        /*显示按钮和窗口*/
        gtk_widget_show (button);
        gtk_widget_show (window);

        /*进入消息处理循环*/
        gtk_main();

        return (0);
}
编译命令
 gcc -o gtkwin.exe gtkwin.c `pkg-config --libs --cflags gtk+-2.0`
运行及输出

说明
1、由于操作系统是中文环境,程序中没有对字体进行处理,所以出现错误提示。

2、所有的 GTK+ 程序都必须包含头头文件 gtk/gtk.h ,它声明了所有 GTK+ 编程中要使用的常量、数据结构和函数。

3、所有 GTK+ 程序开始都要调用 gtk_init(gint &argc, gchar *** argv)  函数。该函数定位和打开图形显示,并对颜色、信号进行初始化。在命令行输入的参数由该函数传递给 GTK+ ,该函数读取并获得与它有关的命令行参数。

4、函数 gtk_window_new( GTK_WINDOW_TOPLEVEL) 用于创建顶极窗口,GTK+ 程序的主窗口被称为顶极窗口。虽然一个程序可以创建多个顶极窗口,但通常只创建一个。

5、图形界面下,用户的任何一个操作 ( 鼠标单击、按下键盘某键)都称为发生了一个事件,GTK+ 都有相应的小心信号产生,如果在程序中定义了处理该消息信号的函数,在事件发生后,消息信号处理函数会自动调用。这样的消息信号处理函数也称为回调函数,因为这种函数是在程序里定义,但程序中并没有显式调用而是由系统在事件发生后自动调用。

6、hello() 和 destroy() 就是两个处理消息的回调函数。destroy() 函数中调用了 GTK+ 函数 gtk_main_quit() ,此函数使程序退出 gtk_main() 并完成一些清理工作。

7、g_signal_connet() 函数用于在控件和消息处理函数间建立联系,该函数的第一个参数为产生消息的控件,第二个参数是消息名,第三个参数是消息发生后要调用的函数名,第四个参数是传递给消息处理函数的参数,可以为空值(NULL)。

8、gtk_container_border_width() 函数用于设置窗口边框宽度,这是一个设置窗口属性的函数。

9、net_button_new_with_label() 函数创建一个带文本标签的按钮,它完成内存分配,并把所分配到的内存的首地址赋给 GtkWidget 类型指针。

10、gtk_container_add() 通知 GTK+ 将按钮加入到主窗口中,函数 gtk_widget_show() 用于显示控件。

11、gtk_main() 使 GTK+ 进入消息处理循环。每个 GTK+ 应用程序都有一个 gtk_main() 函数,该函数使程序进入休眠状态。当有事件发生,如果程序中有相应的处理函数,gtk_main() 就调用相应的消息处理函数。


编译时所用的 pkg-config 参考:http://www.groad.net/bbs/read.ph ... 1&toread=1#2051

为了简单起见,可添加一个 Makefile 文件,其内容如下:
CC=gcc
program=gtkwin

LDLIBS=`pkg-config --libs gtk+-2.0`
CFLAGS= -Wall -g `pkg-config --cflags gtk+-2.0`

$(program):$(program).o
    $(CC) $(LDLIBS) $(program).o -o $(program)

$(program).o:$(program).c
    $(CC) $(CFLAGS) -c $(program).c

clean:
    -rm -f $(program)
    -rm -f *.o
以后,编译其他 GTK+ 程序时,只要将 gtkwin 改成要生成的文件名即可。

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
 楼主| 发表于 2009-8-7 21:58:38 | 显示全部楼层
在上面的代码中,在 gtk_container_add (GTK_CONTAINER(window), button); 之前加上一条语句:
g_signal_connect (GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(window));
如此以来,对应于 button 按钮的 "clicked" 事件就有了两个处理函数,一个是在程序中定义的回调函数 hello ,一个是 GTK+ 预定义的 gtk_widget_destroy()。gtk_widget_destroy()的作用是销毁按钮,如下图示:

如果要删除控件和消息处理函数的关联,可以调用 g_signal_disconnect() ,该函数的原型是:
void g_signal__handler _disconnect(GtkObject *object, gulong id);
      object : 要删除消息处理函数的控件
      id : g_signal_connect() 或 g_signal_connect_swapped() 函数的返回值。
下面这个函数可以删除某控件的所有消息处理函数:
void g_signal_handlers_destroy(GtkObject *object);
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-3-29 02:05 , Processed in 0.128518 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表