ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:37.12KB ,
资源ID:19831094      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/19831094.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(一些GTK+用法.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

一些GTK+用法.docx

1、一些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*

2、 button, gpointer userdata) 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(int

3、argc, 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),Hello World!); gtk_containe

4、r_set_border_width(GTK_CONTAINER(window),10); /创建按钮控件,为单击信号加回调函数,将其放入窗口中 button=gtk_button_new_with_label(Hello World!); g_signal_connect(G_OBJECT(button),clicked, G_CALLBACK(on_button_clicked),(gpointer)你好!n自由的世界。); gtk_container_add(GTK_CONTAINER(window),button); /下面函数显示窗口控件同时显示其中的所有其他控件 gtk_widge

5、t_show_all(window); gtk_main(); return FALSE; 能直接用命令gcc pkg-config -cflags -libs gtk+2.0 hello.c -o hello来编译上面的代码,但最佳做一个Makefile文件内容如下: CC = gccall: $(CC) pkg-config -cflags -libs gtk+-2.0 hello.c -o hello 这样的话能用make命令来编译,使得简单了许多,也不容易出错了。再次强调的是关于引号的问题,非常多初学者常犯这个错误,是下面的那个单引号,而非;这涉及到了LINUXSHELL编程中的命令引

6、用,LINUX下的标准的BASH是支持命令引用的,而其他的SHELL就不一定了。 下两图分别为程式的运行时的窗口和点击Hello World按钮弹出的对话框: 初始化、主循环和退出 和MSWINDOWS下用C研发GUI程式不同,GTK+不用WinMain函数,由C语言中的标准格式的main函数直接切入,这在UNIX操作系统家族中是统一的。函数gtk_init标致GTK+程式的开始,他的两个参数是main函数的两个参数的地址。在此函数之后就能处理程式的各种相关部分,如控件的创建、显示、为控件的信号加回调函数、设定或修改控件的属性等。最后执行gtk_main函数,程式进入主事件循环,开始接收信号并

7、为信号调用其相应用的回调函数。函数gtk_main_quit用来结束主事件循环,即退出GTK+程式的运行。 控件的创建、显示和布局 GTK+中的控件分为容器控件和非容器控件1,非容器控件主要是基础的GUI元素,如文字标签、图像、文字录入控件等,容器控件有多种,一起点是能按一定方式来排放其他控件,GTK+以此形成了独特的GUI界面布局风格。GTK+控件的创建函数一般形式为:gtk_控件名_new(参数)或gtk_控件名_new_with_参数名(参数),他的返回值为GtkWidget型的指针,创建完成后就能调用gtk_widget_show函数来显示或隐藏此控件,或用相关的函数来修改控件的属性。

8、 信号连接和回调函数 GTK+用信号和回调函数的方式来处理来自外部的事件,控件间继承有其父控件的相同信号,不同的控件也有各自不同的信号,如按钮控件有clicked信号,而文字标签控件则没有此信号。GTK+2.0采用宏g_signal_connect来完成信号和回调函数的连接,这是他和GTK+1.X版的一个关键不同之处,这个宏有四个参数,第一个参数是连接信号的对象,如此例中的button或window,要用G_OBJECT宏来转换一下,即将对象的类型GtkWidget转换为GObject类型,格式一般为G_OBJECT(button);第二个参数为字符串格式的信号名;第三个参数为回调函数名,用G

9、_CALLBACK宏来转换一下;第四个参数为要传给回调函数的参数的指针。如上例中为按钮的clicked的信号加的回调函数on_button_clicked: g_signal_connect(G_OBJECT(button),clicked, G_CALLBACK(on_button_clicked),(gpointer)你好!n自由的世界。); 细心的读者马上会看到此宏的一个缺点,即只能为回调函数传递一个参数,当然聪明的读者马上也会想到采用结构类型来传递多个参数。上面的内容对初学者似乎复杂了些,只要过了这个门槛,事实上就步入了GTK+的世界。 回页首国际化编程 gettext软件包 上面的程

10、式运行是主窗口显示为英文,我们完万能将其改为中文,这样单一的语言版本不适于应用的国际化,GTK+中用gettext软件包来实现国际化,使这一问题变得非常简单。gettext软件包是GNU工程中解决国际化问题的重要工具,目前版本是0.11.x,支持C/C+和JAVA语言,他在开源界应用相当广泛,GNOME/GTK+的国际化问题都是用他来解决的,正常的情况下GNU/LINUX系统是默认安装这一软件包的。 代码实现 首先是在原始码中加入相关的C语言头文件如下: #include /gettext支持#include /locale支持 然后是定义宏,下面的定义形式在GNOME/GTK+中应用的标准格

11、式: #define PACKAGE hello /软件包名#define LOCALEDIR ./locale /locale所在目录#define _(string) gettext(string)#define N_(string) string 在程式的主函数中加入下面相关函数: bindtextdomain(PACKAGE,LOCALEDIR); /以上函数用来设定国际化翻译包所在位置 textdomain(PACKAGE); /以上函数用来设定国际化翻译包名称,省略了.mo 相关的字符串修改 将代码中需要国际化-即多语言输出的字符串改写为_()宏,代码如下: gtk_window_

12、set_title(GTK_WINDOW(window),_(Hello World!); . . button=gtk_button_new_with_label(_(Hello World!); g_signal_connect(G_OBJECT(button),clicked, G_CALLBACK(on_button_clicked),(gpointer)(_(Hello, the Free World!);. . 生成相关文件和翻译 完成以上修改后,执行如下命令:xgettext -k_ -o hello.pohello.c,他的功能是将hello.c中的以下划线开始括号中(如宏定义

13、所示)的字符串加入到hello.po文件中。po文件的头部能加入软件包的名称、版本、翻译者的邮件地址等,po文件中以#开始的行为注释内容,以下为省略了头部的hello.po文件内容,msgid后面的内容为英文,msgstr后面的内容为翻译的中文,翻译好后保存为UTF8格式。 #: hello.c:26 hello.c:29msgid Hello World!msgstr 你好世界!#: hello.c:31msgid Hello, the Free World!msgstr 你好,自由的世界! 下一步执行命令:msgfmt -ohello.mo hello.po将hello.po文件格式化为h

14、ello.mo文件,这样程式在运行时就能根据当前locale的设定来正确读取mo文件中的数据,从而显示关语言的信息了。关于.mo文件的位置,本程式设在./locale目录下的中文目录zh_CN下的LC_MESSAGES目录下,即./locale/zh_CN/LC_MESSAGES目录下,在REDHAT中默认的目录是/usr/share/locale。将此步骤生成的mo文件复制到相应的目录下,将locale设为简体中文,再运行此程式,测试结果就变为中文了(如下图),如locale设为英文则显示仍为上面的英文信息。 回页首自动生成Makefile和打包 自动生成Makefile文件是非常多LINU

15、X编程爱好者的愿望,事实上只要你运用好AUTOCONF和AUTOMAKE这两个工具,就会非常容易的生成Makefile文件,并能实现打包(生成*.tar.gz格式的原始码包)功能。和这两个工具相关的设置文件分别是configure.in和Makefile.am。只要我们弄懂这两个文件的格式和相关的宏,就完万能了。 操作过程 前提是做好相应的目录和源程式文件,如本例中在hello目录中的hello.c等。 1、首先执行autoscan命令,生成configure.scan文件; 2、执行mv configure.scan configure.in,将其改名; 3、编辑configure.in,在

16、AC_INIT(hello.c)之后加入一行,AM_INIT_AUTOMAKE(hello,1.0)表示软件包名为hello,版本为1.0,如此在make编译后,执行make dist会生成一个名为hello-1.0.tar.gz原始码包,这样是比较附合GNU开源标准的格式。在最后一行AC_OUTPUT()的括号中加入Makefile,表示输出Makefile文件(configure.in文件中更有许多宏定义,周详用法能参考autobook一书),至此编辑configure.in文件结束; 4、执行aclocal命令,生成aclocal.m4宏文件; 5、执行autoconf命令,生成conf

17、igure shell可执行脚本; 6、编辑Makefile.am文件,内容如下: AUTOMAKE_OPTIONS = foreignINCLUDES = pkg-config -cflags gtk+-2.0LIBS = pkg-config -libs gtk+-2.0bin_PROGRAMS = hellohello_SOURCES = hello.c 说明:第一行为AUTOMAKE命令的参数,表示为外部的,不按GNU标准(即不加说明、安装、更改记录等文件);第二行表示包含文件的目录;第三行表示动态链接库的目录和所要链接的库;第四行表示输出的可执行文件名;最后一行表示可执行文件的源程式

18、文件,能有多个文件名。 7、执行命令automake -add-missing -copy,表示创建Makefile.in文件并加入遗失的文件,同时复制过来(默认情况下是做符号链接,这在不同的文件系统间会出问题),至此操作完成。 编译、测试、安装和打包 执行./configure 生成Makefile;执行make编译;执行./hello运行此程式;执行makeinstall来安装,默认情况下是将可执行文件hello复制到/usr/local/bin目录下;执行makedist会在当前目录下生成hello-1.0.tar.gz原始码包,如此就能将你的原始码包向外界发布了。 回页首使用线程 在G

19、TK+中应用线程,除了GLIB中的g_thread_init和g_thread_supported两个函数外,还要用到gdk_thread_init来在XWINDOW中初始化线程应用,另外在线程中要对GTK+控件进行操作时还要在操作前执行函数gdk_thread_enter来进入,操作完成后执行函数gdk_thread_leave来离开,在执行GTK+主循环时也是如此,GTK+以此来达到线程安全;下面代码利用线程创建了一个在屏幕上沿顺时针运动的图像(24x24像素): /thread.c#include typedef struct _Ourarg Ourarg;struct _Ourarg

20、GtkWidget *fixed; GtkWidget *image; gint right; gint left;void image_go(Ourarg *arg) gint x, 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) case 1: x = x + 10; if( x arg-right ) toward = 2; break; case 2: y = y + 10; if( y arg-right ) toward = 3; break; case 3: x = x - 10; if( x left ) toward = 4; break; case 4: y = y -10;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1