文档库 最新最全的文档下载
当前位置:文档库 › GTK+

GTK+

GTK+
GTK+

简而言之,GTK+是一个函数库,它提供一组已制作好的被称为构件的组件。你通过简单易用的函数调用把这写组件和应用程序逻辑组合在一起,从而极大的简化了GUI的创建。

GTK+建立在一个可移植的C语言库和Glib和GObject之上,他们定义了这些类型来实现跨平台开发。

尽管GTK+完全是用C语言来编写的,但是它是通过GObject库支持对象和面向对象的编程。这个库通过宏来支持对象继承和多态。

为了方便起见,我们来看一个继承和多态的例子,它取自于GTK+API文档中的GtkWindow 的对象层次结构:

Gobject

+----GinitiallyUnowned

+----GtkObject

+----GtkWidget

+----GtkContainer

+----GtkBin

+----GtkWindow

这个对象列表明GtkWindow是GtkBin的一个子类,因此所有带GtkBin参数的函数在调用时都可以带GtkWindow参数。同样的,GtkBin继承自GtkContainer,而后者继承自GtkWidget。

因此,为了方便起见,所有的都返回一个GtkWidget的类型。

安装GTK+:

输入两条命令:

1.sudo apt-get install build-essential

2.sudo apt-get install gnome-devel gnome-devel-docs

整个安装过程大概在10分钟左右,具体看网速的快慢。

会存在这样的结果:错误https://www.wendangku.net/doc/642486513.html,/ubuntu/ precise/main sgml-data all 2.0.6 解析“https://www.wendangku.net/doc/642486513.html,:http”时,出现了某些故障(-5 - 没有与主机名关联的地址)~~~解决的方法:1.sudo gedit /etc/resolv.conf,然后在网络中先编辑连接,IPV4设置改为自动(DHCP)仅地址。

2. 在文本中加入

#Google

nameserver8.8.8.8

nameserver8.8.4.4

3.重启网卡

sudo /etc/init.d/networking restart

4.重启:

sudo reboot

如果有不清楚的,还可以参考:

https://www.wendangku.net/doc/642486513.html,/gavin_dinggengjia/article/details/7559765

关于GTK+,我们先来看一下这样的一个案例以了解简单的GTK+构建:

我们先来看一下这样一段代码:

实例位置:linux code\chapter16\container.c

在上述的代码中,我们将会看到这样的几个简单构建:

这是我们用来声明

窗口、标签,横向组

装盒和纵向组装盒

为一个指向Gtkwidget的指针。

这是为了初始化GTK+库,

我们需要调用gtk_ini函数,将命令行参数argc和arg传递给它。这给了GTK+一个机会来解析它需要知道的任何命令行参数。注意:必须在调用任何GTK+函数之前就对其进行这样的初始化。

下面就到了核心代码的阶段,其中window是创建一个空白的窗体。其函数原型为:

GtkWidget* get_window_new(GtkWidgetType type);

参数type根据窗口的目的可取值下面两个值之一:

GTK_WINDOW_TOPLEVEL:一个标准的有框架窗口。

GTK_WINDOW_POPUP:一个适用于对话框的无框架窗口。

绝大多数的情况下我们用的是GTK_WINDOW_TOPLEVEL。

该函数的作用为:在内存中建立窗口。

这些就是对创建的窗口设定一些属性,gtk_window_set_title函数用来向窗口管理器发出请求改变标题栏文本。gtk_window_set_position控制窗口在屏幕上的初始位置。gtk_window_set_default_size 按GTK+绘图单元设置屏幕中窗口的大小。

在这段代码中我们看到自己创建的两个函数,closeApp和delete_event,这两个函数的作用分别是退出和产出某事件后返回一个信号,那么这两个函数什么时候被调用呢?我们来看一下回调函

数这样的一个概念,GTK+有自己的事件和事件监听系统,它们被称为信号和回调函数。它们非常容易使用,因为你可以使用C语言的一个非常有用的特征——函数指针来设置信号处理。GTK+信号是当某事件发生时,由GTKObject对象发出的。一个与信号相连接,并且一旦信号发出,他就会被调用的函数称为回调函数。

回调函数的原型:

Void a_callback_function(GTKWidget *widget,gpotinter user_data);

第一个参数是指向要发出信号的构建的指针,第二个参数是当你连接回调函数时自己任选的指针。

回调函数建立以后,我们就需要对其进行连接,对于连接回调函数我们要用

g_signal_connect,并传递如下的几个参数:构件、信号名(作为字符串)、回调函数和你的指针:Gulong g_signal_connect(gpointer *object,const gchar*name,Gcallback func,gpointer user_data);

例如在上述代码中就,该窗体就连接了closeApp和delete_event这两个事件,此时当信号发生时,这两个函数就被调用。

述代

中,

先创

建了

三个

签、一个横向组装盒和一个纵向组装盒。创建组装盒的函数原型为:

Gtkwidget* get_hbox_new (gboolean homogeneous, gint spacing);

Gtkwidget* get_vbox_new (gboolean homogeneous, gint spacing);

其中homogeneous是一个布尔值,如果它被设置为TRUE,则强制盒中每个构件都占据相同大小的空间,而不管每个构件的大小,spacing以像素为单位设置构件间的间距。

一旦创建好之后,你就可以用gtk_box_pack_start和gtk_box_pack_end函数来添加构件,其函数原型为:

Void gtk_box_pack_start(GtkBox *box,GtkWidget *child,gboolean expand,gboolean fill,guint padding);

Void gtk_box_pack_end(GtkBox *box,GtkWidget *child,gboolean expand,gboolean fill,guint padding);

gtk_box_pack_start向GtkHbox的右边和GtkVbox的底部增加构件,而gtk_box_pack_end 则向GtkHbox的左边和GtkVbox的顶部增加构件。它们的参数控制组装盒中每个构件的间距和格式。

这边涉

及到了三个函数,gtk_container_add 函数:将hbox 放置到窗体中。其函数原型为:

Void gtk_container_add(GtkContainer *container,GtkWidget *widget);

需要注意的是:我们需要使用宏GTK_CONTAINER 在GtkWidget 和GtkContainer 之间进行转换。

gtk_widget_show_all 函数:实际显示窗口,其函数原型为:

gtk_widget_show_all(),该函数只需要调用一个GtkWidget 指针,因此只需把窗口应用传递给它。

gtk_main ()函数,这个关键函数通过把控制权交给GTK+来启动交互过程。

注意:上述代码的编译为:gcc gtk1.c `pkg-config --cflags --libs gtk+-2.0`

上述代码的运行结果为:

GTK+中的构件远远不止这些,下面我们来详细解说一下一些具体的构件:

GtkEntry 构件

我们先来看一下这样一段代码:

实例位置:linux code\chapter16\entry.c

在上述代码中我们先看一下这几个函数:

GtkEntry 是一

个单行输入文本构件:

它有以下的集中用法:

GtkWidget* gtk_entry_new(void);

GtkWidget* gtk_entry_new_with_max_length(gint max);

gtk_entry_new 或固定最大输入文本长度的gtk_entry_new_with_max_length 来创建一个GtkEntry 。限制不超过某一长度将省去你检查输入长度,并通知用户文本输入过长的负担。

G_CONST_RETURN gchar* gtk_entry_get_text(Gtkentry *entry);

gtk_entry_get_text 是用来获取GtkEntry 的内容,它将返回GtkEntry 内部的一个

const_char hb

vbox Lable1 Lable2

指针(G_CONST_RETURN是一个GLib定义的宏)。

GtkEntry还有其他的一些函数:

Void gtk_entry_set_text(GtkEntry *entry,const gchar *text);

Void gtk_entry_append_text(GtkEntry *entry,const gchar text);

Void gtk_entry_prepend_text(GtkEntry *entry,const gchar text);

Void gtk_entry_set_visibility(GtkEntry *entry,gboolean visible);

Void gtk_entry_set_invisible_char(GtkEntry *entry,gchar invch);

Void gtk_entry_set_editable(GtkEntry *entry,gboolean editable);

我们可以通过_set_text、_append_text函数来手工设置或者修改GtkEntry的内容。

如果想将GtkEntry作为一个密码输入框使用,在显示字符的地方用星号等一些字符来表示,我们可以通过gtk_entry_set_visibility函数,并将它的参数visible设为FALSE。

代码运行结果为:

GtkSpinButton构

我们还是先来看一段代码:

实例位置:linux code\chapter16\spin.c

①a djustment = gtk_adjustment_new(100.0, 50.0, 150.0, 0.5, 0.05, 0.05); //创建GtkAdjustMent对象。

首先值得注意的是,要使用gtk_spin_button_new来创建一个GtkSpinButton,首先要创建一个GtkAdjustment对象。GtkAdjustment是一个抽象对象,它包含控制有界数值得逻辑。GtkAdjustment也在其他构件中使用,如GtkHScale和GtkVScale。

要创建GtkAdjustment,先需要给它传递一个初始值、上界、下届和递增量,其函数原型为:GtkObject* gtk_adjustment_new(gdouble value,gdouble lower,gdouble upper,gdouble step_increment,gdouble page_increment.gdouble page_size);

step_increment 和page_increment的值分别设置最小和最大递增量。在使用GtkSpinButton 的情况下,step_increment设置点击箭头时值变化的量。page_increment和page_size对于GtkSpinButton来说并不重要。

例如上述的创建GtkAdjustMent对象中点击箭头时值得变化量为:0.5。

②spinbutton = gtk_spin_button_new(GTK_ADJUSTMENT(adjustment), 0.01, 2);//添加微调按钮

这是一个创建微调按钮的函数,其函数原型为:

GtkWidget*get_spin_button_new(GtkAdjustment*adjustment,gdouble climb_rate,guint digits);

gtk_spin_button_new的第二个参数climb_rate用于控制你持续按着箭头按钮时数值变化的快慢。最后,参数digits设置构件的精度。因此,当digit值为3时,spin按钮将显示0.00。

GtkSpinButton还有其他的一些函数:

GtkWidget*get_spin_button_new_with_range(gdouble min,gdouble max.gdouble step);

GtkWidget*get_spin_button_new_with_range函数可以很方便地在创建GtkSpinButton的同时创建以一个GtkAdjustMent,你只需要传递它上下界和递增量即可。

gdouble gtk_spin_button_get_value(GtkSpinButton*spin_button);

Gint gtk_spin_button_get_value_as_int(GtkSpinButton*spin_button);

使用gtk_spin_button_get_value可以很容易地读取到当前值。如果希望获得一个整数值,还可以使用gtk_spin_button_get_value_as_int。

上述代码的运行结果:

GtkButton构件

我们先来看一下这样的一段代码:

实例位置:linux code\chapter16\buttons.c

GtkWidget *togglebutton;

GtkWidget *checkbutton;

GtkWidget *radiobutton1, *radiobutton2;

togglebutton = gtk_toggle_button_new_with_label("Toggle");

checkbutton = gtk_check_button_new();

radiobutton1 = gtk_radio_button_new(NULL);

radiobutton2 = gtk_radio_button_new_from_widget(GTK_RADIO_BUTTON(radiobutton1));

这里面包含了三个构件:GtkToggleButton、GtkCheckButton、GtkRadioButton,下面我们一一来看一下其函数原型:

①GtkToggleButton:

GtkToggleButton和GtkButton几乎完全一样,但他们之间有一个重要的区别,前者拥有状态。也就是说,他可以关闭和打开,当用户点击GtkToggleButton时,它按通常的方式发出”clicked”信号,并改变其状态。

他的API函数也是非常的明了:

GtkWidget* gtk_toggle_button_new(void);

GtkWidget* gtk_toggle_button_new_with_lable(const gchar*lable);

gboolean gtk_toggle_button_get_active(GtkToggleButton *toggle_button);

void gtk_toggle_button_set_active(GtkToggleButton*toggle_button,gboolean is_active);

两个值得关注的函数gtk_toggle_button_get_active和gtk_toggle_button_set_active。通过调用他们来读取和设置开关按钮的状态。一个TRUE返回值表明GtkToggleButton处于“开”状态。

②GtkCheckButton:

复选按钮框,其函数原型为:

GtkWidget* gtk_check_button_new(void);

GtkWidget* gtk_check_button_new_with_new_lable(const gchar*lable);

其中第二个函数中的参数lable是设置显示文本的默认值。

③GtkRadioButton

单选文本框,一次只能从一组选项中选择一个。

代码中出现了两个函数原型:

gtk_radio_button_new(GList *group)

gtk_radio_button_new_from_widget(GtkRadioButton *group):

RadionButton组由一个GLib的列表对象GSList表示。通过gtk_radio_button_new_from_widget可以从一个现有的按钮中获取GSList。

上述代码的运行结果为:

GNOME构件

GNOME库包含了GNOME构件,它们扩展了GTK+,并用一些更容易使用的构件替换了GTK+中的部分构件,在本节中,我们将看到如何使用GNOME构件来编程:在使用GNOME库之前,你必须在程序的一开始对其进行初始化,就像你在GTK+所做的一样。你在GTK+中调用的是gtk_init,在这里调用的是gnome_program_init。

这个函数的参数有:app_id和app_version(用于向GNOME描述你的程序)、module_info(告诉GNOME初始化那个模块)、命令行参数和应用程序属性(设置以NULL结尾的“名/值”对列表)。其函数原型为:

GnomeProgram* gnome_program_init(const char*app_id,const char *app_version,const GnomeModuleInfo *module_info,int argc,char **agrv,const char *first_property_name,...);

我们先来看一下一段代码:

实例位置:linux code\chapter16\menu1.c

这个代码的目的是创建一个下拉式菜单。菜单栏中的每个菜单都由一个GNOMEUIInfo结构的数组来表示,数组中的每个元素对应一个菜单项。例如,我们现在有File、Edit、View3个菜单,就用3个数组来分别描述菜单的内容。

一旦定义好每个菜单,你就可以通过在另一个GNOMEUIInfo结构数组中引用这些数组来创建菜单栏本身。

GNOMEUIInfo结构有点复杂:

typedef struct{

GnomeUIInfoType type;

ghcar const *lable;

ghcar const *hint;

gpointer moreinfo;

gpointer uer_data ;

gpointer unused_data;

GnomeUIPimapType pixmap_type;

gconstpointer pixmap_info;

guint accelerator_key;

GdkModifierType ac_mods;

GtkWidget *widget;

} GnomeUIInfo;

该结构中的第一项type定义了菜单元素的类型。他可以使GNOME定义的10个GnomeUIInfoType类型中的一个,如图所示:

GnomeUIInfoType 说明

GNOME_APP_UI_ENDOFINFO 数组中的最后一个菜单项

GNOME_APP_UI_ITEM 一个普通的菜单项,或者是一个单选按钮

GNOME_APP_UI_TOGGLEITEM 一个开关按钮或检查框按钮菜单项

GNOME_APP_UI_RADIOITEMS 一个单选按钮组

GNOME_APP_UI_SUBTREE 表示该元素是一个子菜单。

GNOME_APP_UI_SEPARATOR 在菜单项中插入一个分割线

GNOME_APP_UI_HELP 创建一个在“帮组”菜单中使用的帮助主题列表

GNOME_APP_UI_BUILDER_DATA 为接下来的项目指定构造数据

GNOME_APP_UI_ITEM_CONFIGURABULE 一个可配置的菜单项

GNOME_APP_UI_SUBTREE_STOCK 除了标签文本需要在gnome-libs目录中查找以外,

与GNOME_APP_UI_SUBTERR相同

GNOME_APP_UI_INCLUDE 除了这个项目是包含在当前菜单中而不是作为一个子菜单以外,和GNOME_APP_UI_SUBTREE

Moreinfo的目的取决于type。对于ITEM和TOGGLEITEM,它指向菜单项被激活时调用的回调函数。对RADIOITEMS,它指向一个定义单选按钮组的GnomeUIInfo结构数据。

user_data是一个传递给回调函数的任意指针。Pixmap_type和pixmap_info用于为菜单项增加一个位图图标,accelerator_key和ac_modes用于定义一个快捷键。

最后,widget用于在内部保存由菜单创建指向的菜单项构件。

例如,在代码中的第13行到第31行,就是先创建一个submenu菜单项,然后在menu 中包含这个菜单项{GNOME_APP_UI_SUBTREE, "Menu Item 2", "Menu Hint", submenu, NULL, NULL, 0, NULL, 0, 0, NULL},然后在menubar中把menu添加上去。

gnome_app_create_menus ( GNOME_APP(app), menubar)该函数就是用来设置菜单项的,就是把menubar添加到窗体中。

GnomeUIInfo结构对我们来说太不友好了,因为他包含了11个成员,大多数成员的值在通常情况下都是NULL或者零。当你输入它们的时候很容易出错,而且在一个很长的菜单项数组中,很难将它们区分。所以,为了改善这种情况,GNOME宏就随之而来了,它省去了手工输入的麻烦。

GNOME宏一共有两组,第一组定义菜单项,它们需要两个参数:回电函数指针和用户数据。

#include

#define GNOMEUIINFO_MENU_OPEN_ITEM (cb,data)

#define GNOMEUIINFO_MENU_SAVE_ITEM (cb,data)

#define GNOMEUIINFO_MENU_SAVE_AS_ITEM (cb,data)

#define GNOMEUIINFO_MENU_PRINT_ITEM (cb,data)

#define GNOMEUIINFO_MENU_PRINT_SETUP_ITEM (cb,data)

#define GNOMEUIINFO_MENU_CLOSE_ITEM (cb,data)

#define GNOMEUIINFO_MENU_EXIT_ITEM (cb,data)

#define GNOMEUIINFO_MENU_QUIT_ITEM (cb,data)

#define GNOMEUIINFO_MENU_CUT_ITEM (cb,data)

#define GNOMEUIINFO_MENU_COPY_ITEM (cb,data)

#define GNOMEUIINFO_MENU_PASTE_ITEM (cb,data)

#define GNOMEUIINFO_MENU_SLECT_ALL_ITEM (cb,data)

第二组用于顶层菜单定义,你只需要传递数据即可:

#define GNOMEUIINFO_MENU_FILE_TREE (tree)

#define GNOMEUIINFO_MENU_EDIT_TREE (tree)

#define GNOMEUIINFO_MENU_VIEW_TREE (tree)

#define GNOMEUIINFO_MENU_SETTING_TREE (tree)

#define GNOMEUIINFO_MENU_FILES_TREE (tree)

#define GNOMEUIINFO_MENU_WINDOWS_TREE (tree)

#define GNOMEUIINFO_MENU_HELP_TREE (tree)

#define GNOMEUIINFO_MENU_GAME_TREE (tree)

我们来看一下通过GNOME宏来建立的菜单:

实例位置:linux code\chapter16\menu2

代码运行结果:

我们可以看到,虽然实现的功能是一样的,但是代码量和复杂程度却降低了很多。

对话框

GUI应用程序的一个重要组成部分就是与用户交互通知用户重要的事件。通常,你会为此创建一个临时带有OK和Cancle按钮的窗口,如果信息非常重要,它需要一个立即响应(如删除一个文件)你就希望能够阻止用户访问任何其他的窗口,知道他做出了一个选择(这类窗口被称为模式对话框)。

GTKDialog将窗口分为快两个区域,一个放构件的内容,一个放底部的按钮,你可以在创建对话框时指定你想要的按钮和其他对话框设置,其函数原型为:

GtkWidget* gtk_dialog_new_with_button(const gchar *title,

GtkWidget *parent,

GtkDiakogFlags flags,

Const gchar *first_button_text,

...);

这个函数创建了一个完整的带有标题和按钮的对话框。第二个参数parent应指向应用程序的主窗口,这样GTK+才可以确保对话框是一直连接到主窗口的。当主窗口被最小化时,他也会跟着最小化。

flags参数决定了对话框可以拥有的属性组合:

GTK_DIALOG_MODAL;

GTK_DIALOG_DESTORY_WITH_PARENT;

GTK_DIALOG_NO_SEPARATOR;

下面我们来看一段这样的代码:

实例位置:linux code\chapter16\GTKDialog.c

GtkWidget *dialog;

dialog = gtk_message_dialog_new(window,

GTK_DIALOG_DESTROY_WITH_PARENT,

GTK_MESSAGE_QUESTION,//图标

GTK_BUTTONS_YES_NO,//带有yes和no的按钮

"Are you sure to quit?");

我们在这里创建了带有两个按钮的对话框。该函数的函数模型为:

GtkWidget* gtk_message_dialog_new(GtkWindow *parent,GtkDialogFlags,

GtkMessageType type,

GtkButtonType buttons,

Const gchar *message_format,

...);

这个函数创建了一个带有图标、标题和可配置按钮的完整对话框。参数type根据对话框的目的设置它的图标和标题。

② gtk_dialog_run(GTK_DIALOG(dialog)),一旦创建好一个对话框,下一步就是等待响应。这可以使用下面的额两种方法来完成:一种是模式方式,它阻止除对话框以外的一切输入;一种是非模式的方法,它像对待其他窗口一样来对待对话框。这边我们就是用了模式对话框的形式。下面来详细讲解一下模式对话框的形式。

模式对话框强制用户首先响应,我们可以通过gtk_dialog_run来阻止程序的进一步执行,知道这个按钮被按下来,来帮你解决掉问题。当用户按下一个按钮的时候,gtk_dialog_run会通过返回一个int类型的结果来表明用户按下了那哪个按钮。GTK+通常定义一个枚举类型来描述可能的值:

typedef enum{

GTK_RESPONSE_NONE =-1,

GTK_RESPONSE_REJECT=-2,

GTK_RESPONSE_ACCEPT=-3,

GTK_RESPONSE_DELETE_EVENT=-4,

GTK_RESPONSE_OK=-5,

GTK_RESPONSE_CANCLE=-6,

GTK_RESPONSE_CLOSE=-7,

GTK_RESPONSE_YES=-8,

GTK_RESPONSE_NO=-9,

GTK_RESPONSE_APPLY=-10,

GTK_RESPONSE_HELP=-11

}GtkResponseType;

③gtk_widget_destroy(dialog);在最后的进行相应的操作之后要对对话框进行相应的清理。

函数的运行结果为:

这是界

面编程

的步,其

实真正

常用的

是QT,

在下一节中我们将会对QT进行详细地讲解。

GTK图形界面编程-计算器的实现

目录 一.课程设计目的 (2) 二.课程设计任务与要求 (2) 三.功能分析 (3) 四.功能模块分析与设计 (3) 1.图形界面设计 (4) 2.按键处理模块 (4) 3.数字键处理模块 (5) 4.小数点处理模块 (6) 5.加减乘除运算按键处理模块 (6) 6.结果按键,即等号处理模块 (7)

7.清除模块 (8) 五.功能测试 (9) 六.课程设计总结 (10) 高级C语言实训报告 一.课程设计目的 现在大多数的计算器都具备+,-,*,/等四则运算的功能。用计算器来算数显然比用脑袋或用纸笔计算要来得方便。当我们看到一个很长很大的表达式需要得到结果时,我们就会想到计算器,这样,本程序就是为解决大家基本四则运算的问题而产生的。主要基于对表达式的分析并利用C进行编程进而实现算法的。C在程序运行效率、内存使用的可控性和编程的灵活性上均具有较大的优势,与汇编语言和C语言更具有面向对象的优点,我采用Ubuntu Linux操作系统以及GTK+2.0,以达到算法快速有效地执行。 二.课程设计任务与要求 1.使用C语言和GTK+图形库进行开发,计算器可以在装有GTK+运行环境的各种操作系统上运行;

2.实现标准型计算器上的四则运算功能(参考Windows 7系统标准型计算器); 3.根据课程设计进度对程序功能进行扩展: 添加捕捉键盘事件功能,通过PC键盘的数字键盘也可以进行输入; 为计算器添加存储功能(MR、M+、M-等按键功能),实现完整的标准型计算器; 4.实现科学型计算器上的四则运算功能(参考Windows 7系统科学型计算器或Ubuntu 系统基本型计算器)。 本课程设计内容是在Linux平台下开发一个简单的计算器程序,采用GCC编程工具和GTK+2.0工具包等软件为开发工具以及C语言知识实现图形化的计算器程序。该程序能够实现的对整数的加减乘除和小数的加减乘除。 三.功能分析 1.整数之间的加减乘除运算 2.小数之间的加减乘除运算 3.小数与整数之间的加减乘除运算 四.功能模块分析与设计 本计算器主要是完成整数之间、小数之间、整数和小数之间的加减乘除的运算,使用GTK+完成界面布局。 根据需求分析的结果,总体结构如下图所示:

c语言课程设计GTK+计算器的实现

目录 设计背景 (2) GTK+简介 (2) 程序实现 (3) 界面的构建 (3) 窗口的实现 (3) 按钮的实现 (4) 输入框的实现 (5) 回调函数的实现 (5) 数字键 (6) 小数点 (6) 运算符 (7) 等号 (7) 清除键 (8) 退格键 (8) 键盘事件 (8) 心得体会 (10) 参考文献 (10)

设计背景 GTK+简介 GTK+一开始是作为流行的GNU图像处理程序GIMP的一部分产生的,逐渐成为功能强大最受欢迎的工具包之一,因为变成了一个独立的项目。它是一个函数库,提供了一组已经制作好的被称为构件的组件,可以通过简单易懂的函数调用把这些组件和应用程序逻辑组合在一起,从而极大的简化了GUI的创建。 GTK+使用自由的LGPL许可证,它完全是用C语言编写的,绝大多数GTK也是用C语言编写的,也有许多语言绑定可以在C++,Python,PHP,Java中使用它。 GTK本身是建立在一组其它函数库上的,例如他需要Glib提供底层数据结构、类型、线程支持、事件循环和动态加载。 Glib和GObject提供了一组数据类型、函数和宏的标准替代集来进行内存管理和处理常见任务,从而实现跨平台开发,意味着GTK+能够可靠的移植到其他平台和体系结构上。 Glib还定义了一些方便的常量: #define FALSE 0 #define TRUE !FALSE 这些附加的数据类型基本上是标准C语言数据类型的代替,以及用于确保跨平台字节长度不变。 ●gint、guint、gchar、guchar、glong、gulong、gfloat和gdouble是标准C 语言数据类型的简单代替 ●gpointer与(void *)同义 ●gboolean 用于表示布尔类型的值,它事对int的一个包装 ●gint8、guint8、gint16、guint16、gint32和guint32是保证字节长度的有 符合和无符号类型 尽管GTK+是完全用C语言编写的,但是它通过GObjiect库支持对象和面向对象编程,这个库通过宏来支持对象继承和多态。为了方便起见,所有构件创建函数都返回一个GtkWidget类型。

一步一步学GTK+之多窗口

一、按照一定的逻辑去切割代码并实现多窗口 上一篇中完成了一个简单的软件界面,考虑到这个软件主要的目的是在软件中容纳很多控件,一个窗口中不可能全部包含进去的。所以这篇内容是我们一起来学下多窗口。既然我们要实现多窗口,那么就不能把所有代码放到一个文件中,这样会很混乱的,一个文件来放一个窗口,然后用main.c的入口文件来调度它们。使用我先把文件的结构分为: main.c——入口文件 window_main.c——主窗口文件 window_test.c——测试用的子窗口文件 common_func.c——各个窗口调用的公共函数文件 既然涉及到公共函数会被其他窗口调用,我们还需要建立一些头文件,在其中加入一些宏来防止重复包含文件。 common_func.h #ifndef __COMMON_FUNC_H__ #define__COMMON_FUNC_H__ #include GdkPixbuf *create_pixbuf(const gchar * filename); void toggle_display(GtkWidget *widget, gpointer oneofwidget); #endif// __COMMON_FUNC_H__ common.c #include "common_func.h" /* @Description: 从一个图片中获取信息得到pixbuf @param: gchar filename */ GdkPixbuf *create_pixbuf(const gchar * filename) { GdkPixbuf *pixbuf; GError *error = NULL; /* * 函数gdk_pixbuf_new_from_file() 从一个图片文件中加载图象数据,从而生成一个新的pixbuf, * 至于文件中包含图象的格式,是由系统自动检测的。如果该函数返回值是NULL 的话,程序就会出现错误。 */ pixbuf = gdk_pixbuf_new_from_file(filename, &error); if(!pixbuf) {

LINUX下GTK+实现简单计算器

摘要 随着计算机的越来越普及,学习计算机的人越来越多。作为一个学习计算机的人员,最基本的那就是必须会编程。但是在微软垄断下的现在的计算机编程大多是基于windows下的编程。设置很多人没听说过或者不会Linux下编程。本设计的目的就是为初学Linux下编程的人员提供基础的例子。让大家了解Linux下的编程。 本程序运用Linux下的工具GTK+2.0作为工具,以C语言为核心编写。简单易懂,GTK+2.0主要功能有: ●窗口与简单控件的实现 ●菜单与工具栏的实现 ●常用控件的实现 ●对话框的实现 …… 关键词:Linux GTK+2.0 Abstract As computers become increasingly popular, more and more people learn the computer. As a learning computer personnel, the most basic that we must be programmed. However, under the Microsoft monopoly in computer programming is now mostly under the windows-based programming. Set a lot of people never heard of or will not, under Linux programming. The purpose of this design is for beginners programming under Linux provides the basis of examples. Let everyone know the programming under Linux. ●Window and a simple realization of the control ●Realization of the menu and tool bar ●The realization of common control ●Realization of the dialog box …… KEYWORDS:Linux GTK+2.0

基于Linux的GTK+图形界面编程——扫雷游戏设计

基于Linux的GTK+图形界面编程——扫雷游戏设计 摘要 本篇课程设计主要说明使用Linux下的GTK+2.0库开发一个简单的扫雷程序,建立一个图片矩阵,由于图片控件不能接收事件,必须将它们放到事件盒中,才能接收到事件。这样就能处理鼠标事件以及鼠标事件对应的图片显示处理,并对用户的操作做出提示。最后可以完成基本的扫雷任务,由于本人能力有限,无法设计自定义的游戏级别,只能使用规定了的游戏级别。 关键词:linux;扫雷;GTK+;游戏

GUI PROGRAMMING BASE ON GTK+ —— MINESWEEPER GAME DESIGN ABSTRACT This course design mainly describe how to develop a minesweeper game by GTK+ library in Linux. First I create a matrix of picture, I must put they on event box for widget of picture can’t receive event. When users click on the picture, the program can deal with display of pictures and display some tips. This program can manage operator of minesweeper. But due to the limit of my ability, users can’t define the level of the game, they can only use defined level. Key words: linux; minesweeper; GTK+; Game

gtk+-安装步骤

Redhat 9.0 上安装gtk+-2.12.0的心得体会 一、首先介绍下个gtk包: 1.1什么是GTK+? GTK+是一个小型而高效的控件库,具有Motif的外观和风格.实际上,它比Motif看起来好多了,它包含有基本的控件和一些很复杂的的控件:例如文件选择控件和颜色选择控件.GTK+提供了一些独特的特性,(至少,我知道其他的控件库不提供他们),例如,按钮不提供标签,它包含了一个子控件,在很多的时候是一个标签,但是,这个子控件也可以是一个映射,图像或者任何其他的程序员想要的集合.在整个的库中,你随处可见这种伸缩性. 1.2. GTK+中的+是什么意思? GTK+中的+是什么意思?Peter Mattis的邮件这样表述: 我原来编写的gtk包含以下的三个库:libglib, libgdk and libgtk.它是一种平行的控件层次,你不能够从一个已存在的控件中得到一个新的控件,新版的gtk+包含一个比信号机制更加标准的回调机制,+用来区别原来的版本和新的版本,你可以把它看作一个加入了面向对象特性的旧版的加强版. 1.3. GTK+, GDK和GLib中的G代表什么? GTK+, GDK和GLib中的G代表什么? GTK+ == Gimp Toolkit GDK == GTK+ Drawing Kit GLib == G Library 1.4. 那里可以找到GTK+的文档? 那里可以找到GTK+的文档? 在GTK+发布版本的doc/文件夹下面, 你可以找到GTK 和GDK的参考资料,本FAQ和GTK指南.另外,你可以通过下面的网址找到这个文件HTML版本https://www.wendangku.net/doc/642486513.html,/,打包的gtk指南,SGML, HTML, Postscript, DVI或text 的版本可以在下面找到 ftp://https://www.wendangku.net/doc/642486513.html,/pub/gtk/tutorial 1.5运行GTK+需要安装什么 运行GTK+需要安装什么编译GTK+,你只需要一个c编译器(gcc),一个X window系统和相关的库文件. 1.6 那里可以得到GTK+ 那里可以得到GTK+ 官方网站ftp://https://www.wendangku.net/doc/642486513.html,/pub/gtk. 一般新的GTK+版本发布的时候,这个网站都很拥挤,所以你可以试试下面列表中的镜像网站. ftp://https://www.wendangku.net/doc/642486513.html,/etc/mirrors 下面有一些镜像网站: ?非洲- ftp://ftp.is.co.za/applications/gimp ?澳大利亚- ftp://https://www.wendangku.net/doc/642486513.html,/pub/gimp ?芬兰- ftp://ftp.funet.fi/pub/sci/graphics/packages/gimp ?德国- ftp://infosoc.uni-koeln.de/pub/https://www.wendangku.net/doc/642486513.html, ?日本- ftp://SunSITE.sut.ac.jp/pub/archives/packages/gimp ?英国- ftp://https://www.wendangku.net/doc/642486513.html,/pub/X/gimp ?美国- ftp://https://www.wendangku.net/doc/642486513.html,/pub/mirrors/https://www.wendangku.net/doc/642486513.html,

gtk简易教程

大家一起用gtk编程1(开始与热身) 转贴请注明出处:https://www.wendangku.net/doc/642486513.html, 作者:lvjinhua@https://www.wendangku.net/doc/642486513.html, 2006.09.20 ?写在最前面 笔者写做本文的目的,主要是为初学GTK编程的新手们提供一个能够快速上手的学习档案,能够通过自己将所有的代码输入并编译,以达到学习的目的。同时,也希望它成为一个参考手册,希望GTK中的每一个API都能在本文中找到相应的示例。 笔者将尽力保证所有的代码都是最短小的,这样才能保证大家都有足够的动力去手工输入它。 由于笔者时间及精力有限,不能一次将所有内容呈现给所有读者,因此拟定了一个计划:每天更新一个章节的内容,在笔者的Blog上进行连载,同时会不断地对以前的内容进行修改和完善,因此为了保证大家能够读到最新的内容,请随时关注笔者的Blog:https://www.wendangku.net/doc/642486513.html, 起笔的日子:2006.09.20 ?为什么是GTK? 为什么不是GTK?笔者不想花费太多的口水去辨证为什么选择GTK而不是其它的东西;任何技术都没有好坏之分,只有使用它的人有能力的强弱之别;笔者认为比较明智的做法是:多编些程序,少做些争论。 ?1、GTK简介 GTK (GIMP Toolkit) 是一套用于创建图形用户界面的工具包。它遵循 LGPL 许可证,所以可以用它来开发开源软件、自由软件,甚至是封闭源代码的商业软件,而不用花费任何费用来购买许可证和使用权。当前,GTK已经被成功地应用到了大量的自由软件及商业软件中,已经取得了很大的成功。 GTK 的创建者: Peter Mattis: petm@https://www.wendangku.net/doc/642486513.html, Spencer Kimball: spencer@https://www.wendangku.net/doc/642486513.html, Josh MacDonald: jmacd@https://www.wendangku.net/doc/642486513.html, 当前,GTK主要由几大组件构成: *Gtk+:GTK的主要构件,包括所有的图形控件及大量实用的API。 *Glib:包含一些标准函数的替代函数,以及一些处理链表等数 据结构的函数等。这些替代函数被用来增强GTK 的可移植性,

linux下C语言设计GTK

设计背景 GTK+简介 GTK+一开始是作为流行的GNU图像处理程序GIMP的一部分产生的,逐渐成为功能强大最受欢迎的工具包之一,因为变成了一个独立的项目。它是一个函数库,提供了一组已经制作好的被称为构件的组件,可以通过简单易懂的函数调用把这些组件和应用程序逻辑组合在一起,从而极大的简化了GUI的创建。 GTK+使用自由的LGPL许可证,它完全是用C语言编写的,绝大多数GTK也是用C语言编写的,也有许多语言绑定可以在C++,Python,PHP,Java中使用它。 GTK本身是建立在一组其它函数库上的,例如他需要Glib提供底层数据结构、类型、线程支持、事件循环和动态加载。 Glib和GObject提供了一组数据类型、函数和宏的标准替代集来进行内存管理和处理常见任务,从而实现跨平台开发,意味着GTK+能够可靠的移植到其他平台和体系结构上。 Glib还定义了一些方便的常量: #define FALSE 0 #define TRUE !FALSE 这些附加的数据类型基本上是标准C语言数据类型的代替,以及用于确保跨平台字节长度不变。 ●gint、guint、gchar、guchar、glong、gulong、gfloat和gdouble是标准C 语言数据类型的简单代替 ●gpointer与(void *)同义 ●gboolean 用于表示布尔类型的值,它事对int的一个包装 ●gint8、guint8、gint16、guint16、gint32和guint32是保证字节长度的有 符合和无符号类型 尽管GTK+是完全用C语言编写的,但是它通过GObjiect库支持对象和面向对象编程,这个库通过宏来支持对象继承和多态。为了方便起见,所有构件创建函数都返回一个GtkWidget类型。 程序实现 要实现本次课程设计要求,首先考虑的是将图形界面和回调函数分开来实现,图形界面通过窗口、按钮、盒、文本框等GTK+构件即可实现,而回调函数应该分

GTK主题创作指南

GTK主题创作指南 author: Tim Orford date: Jan 06作者: Tim Orford日期: Jan 06 Contents内容 introduction简介 general widget properties一般部件性能 gtkrc files gtkrc文件 widget examples小工具的例子 fonts字体 key bindings键绑定 engines发动机 icons图标 cursors游标 further reading进一步阅读 introduction:简介: Gtk programmers will tell you that writing a gtk theme is easy. gtk的程序员会告诉你,写一个GTK主题是容易的。 If you have a full understanding of how gtk is put together, then that may be so, but if you dont have an intimate knowledge of the gtk api and you want to change the visual appearance of your gtk apps then this document may hopefully save you some swearing while you go through the process of trial and error trying to figure out what works and what doesnt.如果你有一个这么全面了解了GTK 是放在一起,那么这可能,但如果你没有一个熟悉的GTK的API的,你要改变你的GTK应用程序外观特征那么这个文件可能希望为您节省一些脏话,而你经过审讯过程中的错误,并试图找出什么可行,什么doesn't。 Its not difficult stuff, but can appear to be somewhat random and non-intuitive due to its close correlation with the underlying widget structure.它的东西并不难,但可以显得有些随机和非直观的部件,由于其结构与基础密切相关。 This document applies only to Gtk2, although Gtk1.2 themes are quite similar.本文件仅适用于与gtk2,虽然Gtk1.2主题非常相似。 Warning: this document is incomplete. The https://www.wendangku.net/doc/642486513.html, tutorial may be useful.警告:本文件是不完整的。https://www.wendangku.net/doc/642486513.html,教程可能是有用的。 theme browsing主题浏览

使用GTK+库实现一个扫雷程序

使用GTK+库实现一个扫雷程序 目录 目录 (1) 1 最基本的GTK+程序 (2) 2 事件处理与界面布局 (6) 3 扫雷程序 (10)

1 最基本的GTK+程序 1.1 GTK库的主要功能 GTK+,这个库实现的功能有, 1 图形显示 (Display) 2 事件处理 (Event) 1.2 GTK库的基本要素 GTK+的主要函数和数据结构包括以下三个部分: 1 控制流程(Control Flow) 2 控件管理(Manage Widget) 3 事件处理(Dispose Event) 1.3 一个最基本的GTK+程序 现在以一个简单的程序进行说明:

代码:simple.c ---------------------------------------- 01 #include 02 03 int main(int argc, char**argv) 04 { 05 GtkWidget *window; 06 GtkWidget *label; 07 gtk_init(&argc, &argv); 08 window=gtk_window_new(GTK_WINDOW_TOPLEVEL); 09 g_signal_connect(G_OBJECT(window), "delete_event", 10 gtk_main_quit, NULL); 11 label=gtk_label_new("GTK+"); 12 gtk_container_add(GTK_CONTAINER(window), label); 13 gtk_widget_show_all(window); 14 gtk_main(); 15 return 0; 16 } ---------------------------------------- 对代码进行简单说明:

gtk做个按钮界面

gtk做个按钮界面 #include #include #include #include Display* disp ; FakeKey *fk; static char *keyboard_display[] = { "A/0", "B/0", "C/0", "D/0", "E/0", "F/0", "G/0" }; static gushort keyboard_send[] = { XK_A, XK_B, XK_C, XK_D, XK_E, XK_F, XK_G }; void da_call (GtkDialog *dialog, gint response_id, gpointer user_data) { if (GTK_RESPONSE_OK == response_id) g_print("OK_Pressed"); else if (GTK_RESPONSE_CANCEL == response_id) g_print("CANCEL_Pressed"); } gboolean bt_release (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { gint i = GPOINTER_TO_UINT(user_data); fakekey_press_keysym(fk, keyboard_send[i], 0); fakekey_release(fk); return TRUE; } void clicked_callback(GtkButton *button, GtkWindow *window) {

Gtk 分栏列表框

G t k C L i s t (分栏列表构件)是G t k L i s t (列表构件)的替代品,但它提供更多的特性。分栏列表构件是多列列表构件,它有能力处理数千行的信息。每一列都可以有一个标题,而且可以是活动的。你还可以将函数绑定到列选择上。 -------------------------------------------------------------------------------- 创建分栏列表构件GtkCList 创建G t k C l i s t构件的方法和创建其他构件的方法是类似的。有两种方法,一种是容易的,一种是难的。因为G t k C L i s t可以有多列,因而在创建它之前,必须确定要创建的列表的列数。 GtkWidget *gtk_clist_new ( gint columns ); GtkWidget *gtk_clist_new_with_titles( gint columns,gchar *titles[] ); 第一种方式很简单,而第二种需要作一些解释。每一列都可以有一个与之相联系的标题,标题可以是一个标签构件,或者是一个按钮,只要能够对我们的动作作出响应。如果要使用第二种方式,则必须提供一个指向标题文本的指针,指针数目应该与列数相等。当然,我们可以用第一种方式,然后再手工添加标题以达到相同的目的。 注意,分栏列表构件没有自己的滚动条,如果要提供滚动条功能,应该将分栏列表构件放在一个滚动窗口构件中。 -------------------------------------------------------------------------------- 操作模式 有几个可以用于改变分栏列表构件行为的属性。先看下面这个: void gtk_clist_set_selection_mode( GtkCList *clist,GtkSelectionMode mode ); 就像函数名所暗示的一样,它设置了分栏列表的选择模式。第一个参数是要设置的分栏列表构件,第二个参数是单元的选择模式(取值在g t k e n u m s . h中有定义)。目前,有下面这些模式可以使用: ? G T K _ S E L E C T I O N _ S I N G L E:选定内容为N U L L,或包含一个指向单个被选中项目的G l i s t指针。 ? G T K _ S E L E C T I O N _ B R O W S E:如果G t k C L i s t中不包含构件,或只包含不敏感的构件, 则选定内容为N U L L。否则,它包含一个指向G L i s t结构的G L i s t指针,因而包含一个列表项。 ? G T K _ S E L E C T I O N _ M U LT I P L E:如果没有列表项被选中,选定内容为NULL ;或者选定内容是一个指向第一个被选中列表项的指针。然后依次指向G L i s t结构中第二个被选中的列表项,等等。对G t k C L i s t来说这是缺省模式。 ? GTK_SELECTION_EXTENDED:选中内容总是N U L L。 在G T K今后的版本中可能会增加其他模式。 还可以定义分栏列表构件的边框。使用以下函数完成定义:

GTK学习个人笔记

推荐https://www.wendangku.net/doc/642486513.html, 可是目前GTK+的stable版式 2.18 ,unstable版是2.19.3 哪里跑出来的2.8和2.4呀。原来↓:

GtkWidget* gtk_button_new_from_stock (const gchar *stock_id) 从一个"常备项目/固化词条/glib提供的固有原料"(stock item),创建一个GtkButton包含图像和文本. 一些stock ids具有预处理宏,例如GTK_STOCK_OK和GTK_STOCK_APPLY. 如果遇到不识别的stock_id, 那么他们将被视为mnemonic label (参见gtk_button_new_with_mnemonic()). stock_id :the name of the stock item Returns:a new GtkButton gtk_button_new () GtkWidget* gtk_button_new (void) 创建一个新的GtkButton构件(widget). 用gtk_container_add()为button构件添加一个子构件。 Returns :The newly created GtkButton widget. gtk_box_pack_start () void gtk_box_pack_start (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding) 为BOX添加child, 从box的起点开始装入child. 这个child被装入后,其他的任何child装入时都将从起点装入child。(从左向右,从上到下) box :一个GtkBox child :被添加到box中的GtkWidget expand : TRUE if the new child is to be given extra space allocated to box. The extra space will be divided evenly between all children of box that use this option fill : TRUE if space given to child by the expand option is actually allocated to child, rather than just padding it. 如果expand 被设为FLASE的时候,这个属性将无效. A child is allocated the full height of a GtkHBox and the full width of a GtkVBox. This option affects the other dimension padding : extra space in pixels to put between this child and its neighbors, over and above the global amount specified by "spacing" property. If child is a widget at o reference ends of box, then padding pixels are also put between child and the reference edge of box ---------------------------- gtk_box_pack_end () void gtk_box_pack_end (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding) 为BOX添加child, 从box的尾部(end)开始装入child. 这个child被装入后,其他的任何child装入时都将从尾部(end)装入child。(从右向左,从下到上) 其他同上记gtk_box_pack_start()。 expand / fill / padding 参数的动作,基本如下图

相关文档