一些GTK+用法.docx

上传人:b****1 文档编号:1996936 上传时间:2023-05-02 格式:DOCX 页数:15 大小:37.12KB
下载 相关 举报
一些GTK+用法.docx_第1页
第1页 / 共15页
一些GTK+用法.docx_第2页
第2页 / 共15页
一些GTK+用法.docx_第3页
第3页 / 共15页
一些GTK+用法.docx_第4页
第4页 / 共15页
一些GTK+用法.docx_第5页
第5页 / 共15页
一些GTK+用法.docx_第6页
第6页 / 共15页
一些GTK+用法.docx_第7页
第7页 / 共15页
一些GTK+用法.docx_第8页
第8页 / 共15页
一些GTK+用法.docx_第9页
第9页 / 共15页
一些GTK+用法.docx_第10页
第10页 / 共15页
一些GTK+用法.docx_第11页
第11页 / 共15页
一些GTK+用法.docx_第12页
第12页 / 共15页
一些GTK+用法.docx_第13页
第13页 / 共15页
一些GTK+用法.docx_第14页
第14页 / 共15页
一些GTK+用法.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

一些GTK+用法.docx

《一些GTK+用法.docx》由会员分享,可在线阅读,更多相关《一些GTK+用法.docx(15页珍藏版)》请在冰点文库上搜索。

一些GTK+用法.docx

一些GTK+用法

GTK+采用具有OO特色的C语言研发框架,这使他在研发GUI应用程式能和操作系统紧密结合,同时具有非常大简洁性,其中的非常多

代码只要简单的复制和更改即可完成,只用一个C原始码文件就能创建一个LINUX下的GUI程式。

本文的代码运行环境是

Redhat7.2,GTK+版本是gtk+2.1.2。

            

    

用GTK+写的HelloWorld

            

    

下面的代码是笔者用GTK+编写的一个HelloWorld例程,编译后运行显示一个带按钮的窗口,点击按钮会弹出提示信息对话框。

            

    

            

    //hello.c

#include

//主窗口中按钮的回调函数

void    on_button_clicked(GtkWidget*button,gpointeruserdata)

{

    GtkWidget*dialog;

//创建带确认按钮的对话框,父控件为空

    dialog=gtk_message_dialog_new(NULL,

            GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,

            GTK_MESSAGE_INFO,

            GTK_BUTTONS_OK,

            (gchar*)userdata);

    gtk_dialog_run(GTK_DIALOG(dialog));//显示并运行对话框

    gtk_widget_destroy(dialog);//销毁对话框

}

//主函数

int    main(intargc,char*argv[])

{

    GtkWidget*window,*button;

    //初始化GTK+程式

    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),"HelloWorld!

");

    gtk_container_set_border_width(GTK_CONTAINER(window),10);

    //创建按钮控件,为单击信号加回调函数,将其放入窗口中

    button=gtk_button_new_with_label("HelloWorld!

");

    g_signal_connect(G_OBJECT(button),"clicked",

            G_CALLBACK(on_button_clicked),(gpointer)"你好!

\n自由的世界。

");

    gtk_container_add(GTK_CONTAINER(window),button);

    //下面函数显示窗口控件同时显示其中的所有其他控件

    gtk_widget_show_all(window);

    gtk_main();

    returnFALSE;

}

            

    

能直接用命令"gcc`pkg-config-cflags-libsgtk+2.0`hello.c-ohello"来编译上面的代码,但最佳做一个Makefile文件内容如下:

            

    

            

    CC=gcc

all:

    $(CC)`pkg-config--cflags--libsgtk+-2.0`hello.c-ohello

            

    

这样的话能用make命令来编译,使得简

单了许多,也不容易出错了。

再次强调的是关于引号的问题,非常多初学者常犯这个错误,[`]是[~]下面的那个单引号,而非[’];这涉及到了LINUX

SHELL编程中的命令引用,LINUX下的标准的BASH是支持命令引用的,而其他的SHELL就不一定了。

            

    

下两图分别为程式的运行时的窗口和点击HelloWorld按钮弹出的对话框:

            

    

                

      

                

      

                

      

                

      

            

    

            

    

初始化、主循环和退出

            

    

和MS

WINDOWS下用C研发GUI程式不同,GTK+不用WinMain函数,由C语言中的标准格式的main函数直接切入,这在UNIX操作系统家族中是

统一的。

函数gtk_init标致GTK+程式的开始,他的两个参数是main函数的两个参数的地址。

在此函数之后就能处理程式的各种相关部分,如控件

的创建、显示、为控件的信号加回调函数、设定或修改控件的属性等。

最后执行gtk_main函数,程式进入主事件循环,开始接收信号并为信号调用其相应用

的回调函数。

函数gtk_main_quit用来结束主事件循环,即退出GTK+程式的运行。

            

    

控件的创建、显示和布局

            

    

GTK

+中的控件分为容器控件和非容器控件1,非容器控件主要是基础的GUI元素,如文字标签、图像、文字录入控件等,容器控件有多种,一起点是能按一定方式

来排放其他控件,GTK+以此形成了独特的GUI界面布局风格。

GTK+控件的创建函数一般形式为:

gtk_控件名_new(参数…)或gtk_控件名

_new_with_参数名(参数…),他的返回值为GtkWidget型的指针,创建完成后就能调用gtk_widget_show函数来显示或隐藏

此控件,或用相关的函数来修改控件的属性。

            

    

信号连接和回调函数

            

    

GTK

+用信号和回调函数的方式来处理来自外部的事件,控件间继承有其父控件的相同信号,不同的控件也有各自不同的信号,如按钮控件有"clicked"信号,

而文字标签控件则没有此信号。

GTK+2.0采用宏g_signal_connect来完成信号和回调函数的连接,这是他和GTK+1.X版的一个关键不

同之处,这个宏有四个参数,第一个参数是连接信号的对象,如此例中的button或window,要用G_OBJECT宏来转换一下,即将对象的类型

GtkWidget转换为GObject类型,格式一般为G_OBJECT(button);第二个参数为字符串格式的信号名;第三个参数为回调函数名,

用G_CALLBACK宏来转换一下;第四个参数为要传给回调函数的参数的指针。

如上例中为按钮的"clicked"的信号加的回调函数

"on_button_clicked":

            

    

            

    g_signal_connect(G_OBJECT(button),"clicked",

    G_CALLBACK(on_button_clicked),(gpointer)"你好!

\n自由的世界。

");

            

            

    

细心的读者马上会看到此宏的一个缺点,即只能为回调函数传递一个参数,当然聪明的读者马上也会想到采用结构类型来传递多个参数。

上面的内容对初学者似乎复杂了些,只要过了这个门槛,事实上就步入了GTK+的世界。

            

    

回页首

国际化编程

            

    

gettext软件包

            

    

面的程式运行是主窗口显示为英文,我们完万能将其改为中文,这样单一的语言版本不适于应用的国际化,GTK+中用gettext软件包来实现国际化,使

这一问题变得非常简单。

gettext软件包是GNU工程中解决国际化问题的重要工具,目前版本是0.11.x,支持C/C++和JAVA语言,他在开源

界应用相当广泛,GNOME/GTK+的国际化问题都是用他来解决的,正常的情况下GNU/LINUX系统是默认安装这一软件包的。

            

    

代码实现

            

    

首先是在原始码中加入相关的C语言头文件如下:

            

    

            

    #include        //gettext支持

#include        //locale支持

            

    

然后是定义宏,下面的定义形式在GNOME/GTK+中应用的标准格式:

            

    

            

    #definePACKAGE"hello"    //软件包名

#defineLOCALEDIR"./locale"//locale所在目录

#define_(string)    gettext(string)

#defineN_(string)    string

            

    

在程式的主函数中加入下面相关函数:

            

    

            

        bindtextdomain(PACKAGE,LOCALEDIR);

    //以上函数用来设定国际化翻译包所在位置

    textdomain(PACKAGE);

    //以上函数用来设定国际化翻译包名称,省略了.mo

    

            

    

相关的字符串修改

            

    

将代码中需要国际化--即多语言输出的字符串改写为_()宏,代码如下:

            

    

            

        gtk_window_set_title(GTK_WINDOW(window),_("HelloWorld!

"));

    ......

    button=gtk_button_new_with_label(_("HelloWorld!

"));

    g_signal_connect(G_OBJECT(button),"clicked",

            G_CALLBACK(on_button_clicked),(gpointer)(_("Hello,theFreeWorld!

")));

......

            

    

生成相关文件和翻译

            

    

成以上修改后,执行如下命令:

xgettext-k_-ohello.po

hello.c,他的功能是将hello.c中的以下划线开始括号中(如宏定义所示)的字符串加入到hello.po文件中。

po文件的头部能加入软件

包的名称、版本、翻译者的邮件地址等,po文件中以#开始的行为注释内容,以下为省略了头部的hello.po文件内容,msgid后面的内容为英文,

msgstr后面的内容为翻译的中文,翻译好后保存为UTF8格式。

            

    

            

    #:

hello.c:

26hello.c:

29

msgid"HelloWorld!

"

msgstr"你好世界!

"

#:

hello.c:

31

msgid"Hello,theFreeWorld!

"

msgstr"你好,自由的世界!

"

            

    

下一步执行命令:

msgfmt-o

hello.mohello.po将

hello.po文件格式化为hello.mo文件,这样程式在运行时就能根据当前locale的设定来正确读取mo文件中的数据,从而显示关语言的信息

了。

关于.mo文件的位置,本程式设在./locale目录下的中文目录zh_CN下的LC_MESSAGES目录下,即.

/locale/zh_CN/LC_MESSAGES

目录下,在REDHAT中默认的目录是/usr/share/locale。

将此步骤生成的mo文件复制到相应的目录下,将locale设为简体中文,再

运行此程式,测试结果就变为中文了(如下图),如locale设为英文则显示仍为上面的英文信息。

            

    

                

      

                

      

            

    

            

    

回页首

自动生成Makefile和打包

            

    

动生成Makefile文件是非常多LINUX编程爱好者的愿望,事实上只要你运用好AUTOCONF和AUTOMAKE这两个工具,就会非常容易的生成

Makefile文件,并能实现打包(生成*.tar.gz格式的原始码包)功能。

和这两个工具相关的设置文件分别是configure.in和

Makefile.am。

只要我们弄懂这两个文件的格式和相关的宏,就完万能了。

            

    

操作过程

            

    

前提是做好相应的目录和源程式文件,如本例中在hello目录中的hello.c等。

            

    

1、首先执行autoscan命令,生成configure.scan文件;

            

    

2、执行mvconfigure.scanconfigure.in,将其改名;

            

    

3、

编辑configure.in,在AC_INIT(hello.c)之后加入一行,AM_INIT_AUTOMAKE(hello,1.0)表示软件包名

为hello,版本为1.0,如此在make编译后,执行makedist会生成一个名为

hello-1.0.tar.gz原始码包,这样是比较附合GNU开源标准的格式。

在最后一行AC_OUTPUT()的括号中加入Makefile,表示

输出Makefile文件(configure.in文件中更有许多宏定义,周详用法能参考autobook一书),至此编辑configure.in

文件结束;

            

    

4、执行aclocal命令,生成aclocal.m4宏文件;

            

    

5、执行autoconf命令,生成configureshell可执行脚本;

            

    

6、编辑Makefile.am文件,内容如下:

            

    

            

    AUTOMAKE_OPTIONS=foreign

INCLUDES=`pkg-config--cflagsgtk+-2.0`

LIBS=`pkg-config--libsgtk+-2.0`

bin_PROGRAMS=hello

hello_SOURCES=hello.c

            

    

说明:

第一行为AUTOMAKE命令的参

数,表示为外部的,不按GNU标准(即不加说明、安装、更改记录等文件)

;第二行表示包含文件的目录;第三行表示动态链接库的目录和所要链接的库;第四行表示输出的可执行文件名;最后一行表示可执行文件的源程式文件,能有多

个文件名。

            

    

7、执行命令automake--add-missing-copy,表示创建Makefile.in文件并加入遗失的文件,同时复制过来(默认情况下是做符号链接,这在不同的文件系统间会出问题),至此操作完成。

            

    

编译、测试、安装和打包

            

    

行./configure生成Makefile;执行make编译;执行./hello运行此程式;执行make

install来安装,默认情况下是将可执行文件hello复制到/usr/local/bin目录下;执行make

dist会在当前目录下生成hello-1.0.tar.gz原始码包,如此就能将你的原始码包向外界发布了。

            

    

回页首

使用线程

            

    

在GTK

+中应用线程,

除了GLIB中的g_thread_init和g_thread_supported两个函数外,还要用到gdk_thread_init来在X

WINDOW中初始化线程应用,另外在线程中要对GTK+控件进行操作时还要在操作前执行函数gdk_thread_enter来进入,操作完成后执行函

数gdk_thread_leave来离开,在执行GTK+主循环时也是如此,GTK+以此来达到线程安全;下面代码利用线程创建了一个在屏幕上沿顺时针

运动的图像(24x24像素):

            

    

            

    //thread.c

#include

typedefstruct_OurargOurarg;

struct_Ourarg{

    GtkWidget*fixed;

    GtkWidget*image;

    gintright;

    gintleft;

};

void    image_go(Ourarg*arg)

{

    gintx,y,toward;

    x=y=arg->left;

    toward=1;

    for(;;)

    {

        g_usleep(1500);

        gdk_threads_enter();

        gtk_fixed_move(GTK_FIXED(arg->fixed),arg->image,x,y);

        switch(toward)

        {

        case1:

            x=x+10;

            if(x>arg->right)toward=2;

            break;

        case2:

            y=y+10;

            if(y>arg->right)toward=3;

            break;

        case3:

            x=x-10;

            if(xleft)toward=4;

            break;

        case4:

            y=y-10;

  

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2