目录
控件是基本类型,GUI通过一个一个控件组装起来,形成不同的界面。
容器控件:容纳一个控件:窗口、按钮;容纳多个控件:布局控件。
非容器控件:不可以容纳别的控件:标签、行编辑。
GUI设计步骤:
1)创建主窗口,GUI界面如果是画,主窗口就像一张白纸。
2)创建布局容器。窗口只能放一个控件,而布局里可以放多个控件,可以使界面更丰富。
3)布局容器添加到窗口里。
4)创建所需控件。如按钮、行编辑、标签、图片。
5)控件添加到布局容器里。
6)显示所有控件。
窗口->布局(固定布局、表格布局)->各种控件
GTK程序的基本框架
建立窗口:
新建窗口:
GtkWidget * window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
//创建新的控件—窗口,返回窗口指针。Gtk_Widget是控件类型
GtkWindowType是一个枚举,有两种情况:
GTK_WINDOW_TOPLEVEL:有边框
GTK_WINDOW_POPUP: 没边框
标题设置:
void gtk_window_set_title(GtkWindow *window, const gchar *title);
// window :窗口控件类型的指针; title: 标题名称(字符串型)。
Ex : gtk_window_set_title(window,”工程”);
窗口大小设置
void gtk_widget_set_size_request(GtkWidget *widget,gint width,gint height);
// 用来控件设置大小 (控件指针,整型宽,整型高)
控件显示/隐藏
gtk_widget_show_all(window); //显示窗口全部控件,window:窗口控件
gtk_widget_hide_all(window); // 隐藏窗口全部窗口
按钮相关函数:
创建按钮(带有内容):
GtkWidget * gtk_button_new_with_label(const gchar *label);
// 返回按钮控件指针 注意:按钮只能添加一个控件,带标题后就没发添加图片
创建按钮(无内容)
GtkWidget * gtk_button_new();
获取按钮上的文本内容:
const gcahr * gtk_button_get_label(GtkButton *button);
// 返回字符型指针 button:传入按钮控件指针
创建带图标按钮
void gtk_button_set_image(GtkButton * button,GtkWidget * image);
GtkWidget * image = gtk_image_new_from(“1.jpg”);
// image:图像控件指针
按钮背景色透明
void gtk_button_set_relief(GtkWidget *button ,GtkReliefStyle newstyle);
// newstyle : GTK_RELIEF_NONE 为透明。
图片控件
创建图片资源对象
GdkPixbuf * gdk_pixbuf_new_from_file(const gchar *filename, GError **error);
// filename: 图片路径 error:错误存储的指针
创建图像控件
GtkWidget * gtk_image_new_from_pixbuf(GdkPixbuf *pixbuf);
图片控件重新设置图片
void gtk_image_set_froma_pixbuf (GtkImage * image,GdkPixbuf * pixbuf);
清除控件里的图像数据
void gtk_image_clear(GtkImage * image);
信号与回调函数
窗口关闭时触发的常用信号:destroy(‘x’);
按钮触发常用信号 :pressed
信号连接回调函数写法:
Gulong g_signal_connect(gpointer instance,const gchar * detailed_signal,
GCallback c_handler,gpointer data );
// instance : 信号的发出者 detailed_signal :要连接的信号 ;c_handler:回调函数名称 ; data:传递给回调函数参数。
Ex: g_signal_connect(button,”pressed”,G_CALLBACK(callback),NULL);
回调函数定义:
void callback(GtkButton * button,gpointer user_data);//button :信号发出者; user_data :传递给回调函数的参数
常用布局
水平布局:GtkHBOX
垂直布局:GtkVBox
表格布局:GtkTable
固定布局:GtkFixed
水平布局
创建水平布局控件
GtkWidget * gtk_hbox_new(gboolean homogeneous,gint spacing);
// homogeneous : 是否大小一致 spacing: 控件之间的间隔
Ex:
GtkWidget *hbox = gtk_hbox_new(TRUE, 10);
把横向盒状容器放入窗口
添加控件到窗口容器控件中:
Gtk_container_add(GtkContainer * container,GtkWidget *widget);
Ex:
gtk_container_add(GTK_CONTAINER(window), hbox);//类型强转一下。
固定布局
创建固定布局容器控件
GtkWidget * gtk_fixed_new(void);
添加控件到固定布局容器中
void gtk_fixed_put(GtkFixed * fixed,GtkWidget * widget , gint x,gint y);
// fixed: 要容纳控件的容器; widget:被容纳控件;x,y :起点坐标
其他类型布局及其相关介绍不多介绍。
标签
创建标签
GtkWidget * gtk_label_new(const gchar * str);
设置标签的内容:
void gtk_label_set_text(Gtklabel * label, const gcahr *str);
获取标签内容:
const gchar * gtk_label_get_label(GtkLabel * label);
行编辑器
创建行编辑
GtkWidget * gtk_entry_new(void);
获得文本内容
Const gchar* gtk_entry_get_text(GtkWidget * entry);
设置行编辑的内容
void gtk_entry_set_text(GtkWidget *entry, const gchar *text);
控件添加:
把控件添加到控件
void gtk_container_add(GtkContainer * container,GtkWidget * widget);
// container : 容器(要强制转换类型,将普通控件类型转换GTKCONTAINER) widget :要添加的控件
完成一个APP界面,我们需要先建立窗口,窗口是一个顶层控件,其他东西都加到窗口里面。由于建立的构件是通用构件,需要将它转换为具体的类型以适合调用更为专用的函数。比如建立按钮构件函数会返回GtkWidget指针,但是专用的按钮子程序要求返回GtkButton指针,所以在调用专用的按钮函数以前,需要使用GTK_BUTTON宏将通用的GtkWidget指针转换为GtkButton指针。