首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

先来看一个简单的GTK+图形界面程序的例子,了解这类程序的一般框架。这个程序创建了一个窗口,并在窗口中放置了一个按钮,实现代码如例12-1所示。

例12-1  gtkwin.c

#include<gtk/gtk.h>

   

/*定义回调函数hello,单击按钮时系统自动调用*/

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),20);

           

            /*创建按钮,并设置当单击按钮时,要执行的回调函数*/

            button = gtk_button_new_with_label("Hello World");

            g_signal_connect(GTK_OBJECT(button),"clicked",

                        GTK_SIGNAL_FUNC(hello),"I am from button");

           

            /*将按钮加入到窗口中*/

            gtk_container_add(GTK_CONTAINER(window),button);

            /*显示按钮和窗口*/

            gtk_widget_show(button);

            gtk_widget_show(window);

           

            /*进入消息处理循环*/

            gtk_main();

           

            return 0;

}

编译并运行:

[root@mci tmp]# gcc –o gtkwin gtkwin.c `pkg-config --libs --cflags gtk+-2.0`

[root@mci tmp]# ./gtkwin

注意:编译命令中的字符串“pkg-config --libs –cflags gtk+-2.0”两边是反引号(在键盘上位于数字字符1的左边)。

运行程序,显示如图12-2所示的界面:

程序说明。

文本框:  
图12-2  运行界面

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

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

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

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

hello()和destroy()就是两个处理消息的回调函数。destroy函数中调用了GTK+函数gtk_main_quit,它使程序退出gtk_main()并完成一些清理工作。g_signal_connect函数用于在控件和消息处理函数间建立关联,该函数的第一个参数为产生消息的控件,第二个参数是消息名,第三个参数是消息发生后要调用的函数名,第四个是传递给消息处理函数的参数,可以为空值(即NULL)。关于消息和回调函数的详细内容请参考下一节。

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

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

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

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

(9)为了方便编译,可以在源程序所在目录下编写一个Makefile文件:

CC=gcc

program=gtkwin

#PATH += /usr/include/gtk2.0

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

此时编译程序可以简化为:

[root@mci tmp]# make

要删除编译所产生的中间文件和可执行文件,可以执行命令:

[root@mci tmp]# make clean

如果要编译其他GTK+程序,把Makefile文件中的gtkwin改为相应源程序的文件名即可。Makefile的编写和make命令的使用请参考第5章。

例12-1程序中用到了一些GTK+预定义的函数和数据类型,表12-2和表12-3对其作一个简单的介绍。

表12-2                                                      GTK+预定义的函数

前    缀

含    义

G

glib定义的数据结构

g

glib声明的数据类型

g_

glib定义的函数

gtk_

GTK+定义的函数

Gtk

GTK+库的对象或数据结构

GTK

GTK+定义的宏或者常量

表12-3                                                  GTK+预定义的数据类型

GTK+的数据类型

C语言数据类型

gchar

char

gint

int

glong

long

gboolean

char

gfloat

float

gdouble

double

guchar

unsigned char

guint

unsigned int

gulong

unsigned long

gpointer

void *

gint8

在任何平台上都是8位的整型

gint16

在任何平台上都是16位的整型

gint32

在任何平台上都是32位的整型

guint8

在任何平台上都是8位的无符号整型

guint16

在任何平台上都是16位的无符号整型

guint32

在任何平台上都是32位的无符号整型

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论