GTK

模板

#include<gtk/gtk.h>
int main(int argc,char *argv[])//头文件
{
    gtk_init(&argc,&argv);//初始化
    //......
    //我们所写的代码
    //......
    gtk_main();//主事件循环
    return 0;
}

头文件〈gtk/gtk.h> 包括了GTK+中所有的控件、变量、函数和结构的声明。

gtk_init (&argc, &argv); 所有 GTK应用程序都要调用该函数,而且必须在控件定义之前使用,它为我们设置一些缺省值( 例如视觉和颜色 )映射这个函数将函数库初始化,设置缺省的信号处理函数,并检查通过命令行传递给应用程序的参数,自动完成一些必要的初始化工作。

gtk_main()是在每个Gtk应用程序都要调用的函数。程序运行停在这里等待事件(如键盘事件或鼠标事件)的发生,等待用户来操作窗口。

基本代码
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_new()的功能创建一个窗口并返回这个窗口的控件指针。GTK_WINDOW_TOPLEVEL指明窗口的类型为最上层的主窗口,它最常用。接着创建一个GtkWidget *类型的window变量来接收。GtkWidget是GTK+控件类型,GtkWidget * 能指向任何控件的指针类型。

gtk_widget_show(window);用来显示上一步创建的窗口控件。

窗口添加控件
控件是对数据和方法的封装。控件有自己的属性和方法。属性是指控件的特征。方法是指控件的一些简单而可见的功能。如按钮就是一个控件,这个按钮是方形的,里面有张图片,这是我们能看到外观属性,同时,这个按钮具备被人按下的功能。

GTK中控件主要分为两类:容器控件,非容器控件。

容器控件:它可以容纳别的控件,我们可以理解为盒子,盒子拿来装东西。容器控件又分为两类,一类只能容纳一个控件,如窗口,按钮;另一类能容纳多个控件,如布局控件。

非容器控件:它不可以容纳别的控件,如标签、行编辑。

按钮的创建:
GtkWidget *gtk_button_new_with_label(const gchar *label);

label:按钮上的字符串类型,gchar相当于C语言的char
返回值:按钮控件指针

容器添加控件:
void gtk_container_add(GtkContainer *container, GtkWidget *widget);

container:容纳控件的容器

widget:要添加的控件

显示控件:
void gtk_widget_show(GtkWidget *widget);

widget:需要显示的控件

在这里插入图片描述

#include <gtk/gtk.h> // 头文件

int main( int argc,char *argv[] )

{

gtk_init(&argc, &argv); // 初始化

GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);// 创建顶层窗口

// 创建按钮,文本信息为"Hello GTK+"

GtkWidget *button = gtk_button_new_with_label("Hello GTK+");

// 把按钮放入窗口(窗口也是一种容器) 

gtk_container_add(GTK_CONTAINER(window), button);

gtk_widget_show(button); // 显示按钮

gtk_widget_show(window); // 显示窗口

gtk_main(); // 主事件循环

return 0;

}

代码分析:

void gtk_container_add(GtkContainer *container, GtkWidget *widget);
这里我们是把按钮添加到窗口容器里,widget为按钮指针(以上代码的button),container为窗口指针(以上代码的window),这里需要注意的是,我们创建的窗口(window)返回值为GtkWidget *类型,而gtk_container_add()的第一个参数为GtkContainer *类型,由于 GtkWidget *类型的变量为指向任何控件的万能指针,所以,在函数传参时,根据参数类型进行相应的转换,如:
gtk_container_add( (GtkContainer *)window, button);

C语言里,我们常用这种方法转换。在GTK中,很多内部变量指针类型转换都定义了宏定义,如:
#define GTK_CONTAINER(x) (GtkContainer *)(x)
所以,我们还可以这么写:gtk_container_add(GTK_CONTAINER(window), button);

那么,我们如何知道,哪个类型对应哪个宏定义呢?把要转换类型名字全部变为大写,同时,单词和单词之间以下划线“_”连接,然后,这个名字就是哪个宏定义的名字,如,(GtkButton *)x用宏定义的方法为 GTK_BUTTON(x)。

上面的代码,我们是按钮和窗口都得通过gtk_widget_show()显示出来:

gtk_widget_show(button);// 显示按钮

gtk_widget_show(window);// 显示窗口

但是,假如,窗口里有100个控件,还是这样一个一个地显示出来会比较麻烦,这时候,我们可以通过gtk_widget_show_all()显示所有的控件,里面需要传的是容纳控件的那个容器(这里为窗口)。这样,容器上的控件也会跟着显示。

gtk_widget_show_all(window);// 显示窗口上的所有控件

如果我们希望窗口里多放添加几个控件,直接添加是不成功的,因为窗口只能容纳一个控件的容器。这时候,我们需要借助布局容器,我们先把布局容器添加到窗口里,然后再把所需要添加的控件放在布局容器里。

布局容器的主要分类:水平布局(GtkHBox)、垂直布局(GtkVBox )、表格布局(GtkTable)、固定布局(GtkFixed )。

水平布局容器:

水平布局容器的创建:
GtkWidget *gtk_hbox_new( gboolean homogeneous, gint spacing );

homogeneous:容器内控件是否大小一致( gboolean 取值为TRUE 或 FALSE )
spacing:控件之间的间隔( 以像素点为单位 ),gint相当于 C语言的int
返回值:水平布局控件指针

容器添加添加控件:
void gtk_container_add(GtkContainer *container, GtkWidget *widget);

container:容纳控件的容器
widget:要添加的控件

显示容器上所有控件
void gtk_widget_show_all(GtkWidget *widget);
widget:需要显示的控件

在这里插入图片描述

#include <gtk/gtk.h> // 头文件

int main(int argc, char *argv[]) 

{ 

gtk_init(&argc, &argv);  // 初始化

GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // 创建窗口

// 创建水平布局容器

GtkWidget *hbox = gtk_hbox_new(TRUE, 10); 

// 把容器添加到窗口

gtk_container_add(GTK_CONTAINER(window), hbox); 

// button1

GtkWidget *button = gtk_button_new_with_label("button1");

gtk_container_add(GTK_CONTAINER(hbox), button); // 按钮添加到水平布局容器里

// button2

button = gtk_button_new_with_label("button2");

gtk_container_add(GTK_CONTAINER(hbox), button); // 按钮添加到水平布局容器里

// button3

button = gtk_button_new_with_label("button3");

gtk_container_add(GTK_CONTAINER(hbox), button); // 按钮添加到水平布局容器里

gtk_widget_show_all(window); // 显示所有控件

gtk_main();  // 主事件循环

return 0; 

} 

垂直布局和水平布局的用法基本是一样,无非是新建垂直布局容器接口,还有控件摆放的方向不同。

***垂直布局***容器的创建:

GtkWidget *gtk_vbox_new( gboolean homogeneous, gint spacing );

在这里插入图片描述
#include <gtk/gtk.h> // 头文件

int main(int argc, char *argv[]) 

{ 

gtk_init(&argc, &argv); // 初始化

GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // 创建窗口

// 创建垂直布局容器

GtkWidget *vbox = gtk_vbox_new(TRUE, 10); 

// 把容器添加到窗口

gtk_container_add(GTK_CONTAINER(window), vbox); 

// button1

GtkWidget *button = gtk_button_new_with_label("button1");

gtk_container_add(GTK_CONTAINER(vbox), button); // 按钮添加到垂直布局容器里

// button2

button = gtk_button_new_with_label("button2");

gtk_container_add(GTK_CONTAINER(vbox), button); // 按钮添加到垂直布局容器里

// button3

button = gtk_button_new_with_label("button3");

gtk_container_add(GTK_CONTAINER(vbox), button); // 按钮添加到垂直布局容器里

gtk_widget_show_all(window);// 显示所有控件

gtk_main(); // 主事件循环

return 0; 

} 

表格布局
假如我们要完成下图的布局,我们该怎么做呢?
在这里插入图片描述

1)创建一个垂直布局容器( A )
2)创建一个水平布局容器( B ),一个close按钮( C )
3)将水平布局容器和close按钮添加到垂直布局容器里( 将 B 和 C 添加到 A )
4)创建button 1按钮( D ) 和 button 2按钮( E )
5)再将button 1按钮 和 button 2按钮添加到水平布局容器里( 将 D 和 E 添加到 B )

这样是可以完成上图的布局,但是,假如布局里有有很多控件,我们只是通过水平和垂直容器嵌套布局会很麻烦,而且,控件越多,布局越麻烦。有没有更简单的方法呢?有,就是我们马上要学习的表格布局,具体的操作流程和水平垂直布局一样。

1)创建主窗口

2)创建布局容器

3)布局容器添加到窗口里

4)创建所需控件

5)控件添加到布局容器里

6)显示所有控件

表格布局容器的创建:
GtkWidget *gtk_table_new( guint rows, guint columns, gboolean homogeneous );

rows: 行数
coumns: 列数
homogeneous:容器内表格的大小是否相等
返回值:表格布局容器指针

布局容器添加控件:
void gtk_table_attach_defaults(GtkTable *table, GtkWidget *widget,guint left_attach,guint right_attach,guint top_attach,guint bottom_attach );

table: 容纳控件的容器
widget: 要添加的控件
后四个参数为控件摆放的坐标,规则如下:
在这里插入图片描述

完整代码:

#include <gtk/gtk.h> // 头文件

int main(int argc, char *argv[]) 

{ 

gtk_init(&argc, &argv);  // 初始化

GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // 创建窗口



GtkWidget *table = gtk_table_new(2, 2, TRUE); // 表格布局,2行2列

gtk_container_add(GTK_CONTAINER(window), table); // 容器加入窗口

// button 1

GtkWidget *button = gtk_button_new_with_label("buttton 1");

gtk_table_attach_defaults(GTK_TABLE(table), button, 0, 1, 0, 1);// 把按钮加入布局

// button 2

button = gtk_button_new_with_label("button 2");

gtk_table_attach_defaults(GTK_TABLE(table), button, 1, 2, 0, 1);

// close button

button = gtk_button_new_with_label("close");

gtk_table_attach_defaults(GTK_TABLE(table), button, 0, 2, 1, 2);

gtk_widget_show_all(window); // 显示窗口控件

gtk_main();  // 主事件循环

return 0; 

}

前面我们学习的水平、垂直和表格布局容器,控件会跟着容器大小的变化进行自动适应,而固定布局容器里的控件则不会跟着变化( 则固定不变 )。

***固定布局***的创建:
GtkWidget *gtk_fixed_new(void);
返回值:固定布局容器指针

固定布局容器添加控件:
void gtk_fixed_put( GtkFixed *fixed,GtkWidget *widget,gint x,
gint y );

fixed:容纳控件的容器
widget:要添加的控件

x, y:控件摆放位置的起点坐标,如下图:
在这里插入图片描述

设置控件的大小( 宽和高 ):
void gtk_widget_set_size_request(GtkWidget *widget,gint width,
gint height );

widget:需要设置的控件
width:宽度
height:高度

移动固定布局里控件的位置:
void gtk_fixed_move(GtkFixed *fixed,GtkWidget *widget,gint x,
gint y);

fixed:固定布局容器
widget:需要移动的控件
x, y: 移动的位置
在这里插入图片描述

#include <gtk/gtk.h> 

int main( int argc, char *argv[] ) 

{

gtk_init (&argc, &argv);  // 初始化

GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   // 创建窗口 

GtkWidget *fixed = gtk_fixed_new();  //创建一个固定容器

gtk_container_add(GTK_CONTAINER (window), fixed); // 固定放进窗口

GtkWidget *button1 = gtk_button_new_with_label("^_^"); // 创建按钮

gtk_fixed_put(GTK_FIXED(fixed), button1, 0, 0); // 按钮添加到固定布局



GtkWidget *button2 = gtk_button_new_with_label("@_@"); // 创建按钮

gtk_fixed_put(GTK_FIXED(fixed), button2, 0, 0); // 按钮添加到固定布局



gtk_fixed_move(GTK_FIXED(fixed), button2, 150, 150); // 移动控件的位置



gtk_widget_set_size_request(button2, 100, 50); // 设置控件的大小

gtk_widget_show_all(window); // 显示所有控件

 

gtk_main(); //进入事件循环 

 

return 0; 

} 
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值