GTK+ 2.0 入门教程

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

 
 
 
 
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/dgwblog/p/12144749.html