GTK+程序的基本框架分析
资料在此 https://gitee.com/dgwcode/technical_documents/tree/master/GTK
头文件〈gtk/gtk.h> 包括了 GTK+中所有的控件、变量、函数和结构的声明。
gtk_init():这个函数必须在控件定义之前使用,参数由命令行中解析出来并且送到该程序中。
主要作用是设立 GTK+运行环境,自动完成一些必要的初始化工作。
创建 GtkWidget 窗口控件,并且让它显示出来。
gtk_main():程序运行停在这里等待事件(如键盘事件或鼠标事件)的发生,等待用户来操作窗口。这个函数在所有
的 GTK+程序都要调用。
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkWidget 是 GTK+控件类型,GtkWidget * 能指向任何控件的指针类型。
gtk_window_new()创建一个窗口并返回这个窗口的控件指针。
GTK_WINDOW_TOPLEVEL 指明窗口的类型为最上层的主窗口,它最常用。
gtk_widget_show(window);用来显示上一步创建的窗口控件
窗口的详细设置
窗口的创建
GtkWidget *gtk_window_new(GtkWindowType type);
GtkWindowType 是一个枚举,有两种情况:
GTK_WINDOW_TOPLEVEL:有边框
GTK_WINDOW_POPUP:
没边框
标题的设置
void gtk_window_set_title(GtkWindow *window, const gchar *title);
窗口最小大小的设置
void gtk_widget_set_size_request(GtkWidget *widget,gint width,gint height);
窗口伸缩设置( FALSE 为不可伸缩 )
void gtk_window_set_resizable(GtkWindow *window, gboolean resizable);
显示或隐藏所有控件
void gtk_widget_show_all(GtkWidget *widget);
void gtk_widget_hide_all(GtkWidget *widget);
窗口在显示器位置的设置
void gtk_window_set_position(
GtkWindow *window,
GtkWindowPosition position);
position 常用有 4 种情况:
GTK_WIN_POS_NONE: 不固定
GTK_WIN_POS_CENTER: 居中
GTK_WIN_POS_MOUSE: 出现在鼠标位置
GTK_WIN_POS_CENTER_ALWAYS: 窗口总是居中
#include <gtk/gtk.h> // 头文件 int main( int argc,char *argv[] ) { gtk_init(&argc, &argv); // 初始化 // 创建顶层窗口 GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // 设置窗口的标题 gtk_window_set_title(GTK_WINDOW(window), "Window"); // 设置窗口在显示器中的位置为居中 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); // 设置窗口的最小大小 gtk_widget_set_size_request(window, 400, 300); // 固定窗口的大小 gtk_window_set_resizable(GTK_WINDOW(window), FALSE); // "destroy" 和 gtk_main_quit 连接 g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); // 显示窗口全部控件 // gtk_widget_hide_all(window); // 隐藏窗口 gtk_main(); // 主事件循环 return 0; }
3 进阶体验---带按钮的窗口
创建一个带内容的按钮
GtkWidget *gtk_button_new_with_label(const gchar *label );
获得按钮上面的文本内容
const gchar *gtk_button_get_label(GtkButton *button );
把控件添加到窗口容器里
void gtk_container_add(GtkContainer*container,GtkWidget*widget);
container:容纳控件的容器;widget:要添加的控件
v
#include <gtk/gtk.h> // 头文件 int main( int argc,char *argv[] ) { gtk_init(&argc, &argv); // 初始化 GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // 创建顶层窗口 // 设置窗口边框的宽度(窗口里的控件与窗口边框间隔为 15) gtk_container_set_border_width(GTK_CONTAINER(window), 15); // 创建按钮,文本信息为"Hello GTK+" GtkWidget *button = gtk_button_new_with_label("Hello GTK+"); const char *str = gtk_button_get_label( GTK_BUTTON(button) ); // 获得按钮的内容 printf("str = %s ", str); // 把按钮放入窗口(窗口也是一种容器) gtk_container_add(GTK_CONTAINER(window), button); // 显示控件有两种方法:逐个显示,全部显示 // gtk_widget_show(button); // gtk_widget_show(window); gtk_widget_show_all(window); // 显示窗口全部控件 gtk_main(); // 主事件循环 return 0; }
动起来---信号与回调函数机制
信号与回调函数机制
GTK+采用了信号与回调函数来处理窗口外部传来的事件、消息或信号。当信号发生时,程序自动调用为信号连接
的回调函数。
窗口关闭时触发的常用信号:destroy, delete-event
操作按钮触发的常用信号:clicked, pressed,released
信号与回调函数的连接
gulong g_signal_connect(
gpointer instance,
const gchar *detailed_signal,
GCallback c_handler,
gpointer data );
instance:
信号的发出者
detailed_signal: 要连接信号的名称
c_handler:
回调函数的名称,需要用 G_CALLBACK()进行转换
data:
传递给回调函数的参数
回调函数的定义
信号连接函数的写法:
g_signal_connect(button, "pressed",
G_CALLBACK(callback), NULL);
回调函数的定义(参考“参考文档”)
void callback( GtkButton *button,
gpointer user_data );
button: 信号的发出者
user_data:传给回调函数的数据
#include <gtk/gtk.h> // 头文件 // 按钮按下的处理函数, gpointer 相当于 void * void deal_pressed(GtkButton *button, gpointer user_data) { // 获得按钮的文本信息 const gchar *text = gtk_button_get_label( button ); // g_print() 相当于 C 语言的 printf(), gchar 相当于 char g_print("button_text = %s; user_data = %s ", text, (gchar *)user_data); } int main( int argc,char *argv[] ) { gtk_init(&argc, &argv); // 初始化 GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // 创建顶层窗口 // 设置窗口边框的宽度(窗口里的控件与窗口边框间隔为 15) gtk_container_set_border_width(GTK_CONTAINER(window), 15); /* 当窗口关闭时,窗口会触发 destroy 信号, * 自动调用 gtk_main_quit()结束程序运行*/ g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); GtkWidget *button = gtk_button_new_with_label("Hello GTK+"); // 创建按钮 gtk_container_add(GTK_CONTAINER(window), button); // 把按钮放入窗口(窗口也是一种容器) /* 按钮按下(pressed)后会自动调用 deal_pressed() * "is pressed"是传给 deal_pressed()的数据 */ g_signal_connect(button, "pressed", G_CALLBACK(deal_pressed), "is pressed"); gtk_widget_show_all(window); // 显示窗口全部控件 gtk_main(); // 主事件循环 return 0; }
资料在此 https://gitee.com/dgwcode/technical_documents/tree/master/GTK