以下gtk+编程例子是来自书籍《实用技术:开发Linux应用——用GTK+和GDK开发Linux图形用户界面应用》第115页的内容——最简单的进度条
将之前的进度条程序缩减代码,看看最简单的进度条的代码有那些,是如何运作的,理解一下结构体的使用,我也不是很明白ProgressData *pdata = data;这句的作用
在openSUSE-Leap-15.3-DVD-x86_64的gnome3.34.7桌面环境下编译的,其中pkg-config --cflags --libs gtk±3.0两边有反引号括起来的
ruhong@localhost:~/gtk> gcc -g -Wall test115.c -o test115 pkg-config --cflags --libs gtk+-3.0
> mistake.text 2>&1 ; gedit mistake.text
ruhong@localhost:~/gtk> ./test115
/* the example on page 115 */
#include <gtk/gtk.h>
/* 准备材料,自定义函数 */
/* comments注释 */
typedef struct _ProgressData {
GtkWidget *window;
GtkWidget *pbar;
int timer;
} ProgressData;
/* 结构体,原名是_ProgressData,别名是ProgressData */
gint progress_timeout (gpointer data)
{
ProgressData *pdata = data;
/* 这句内容我也不是很明白, */
gfloat pbar_value = 0;
/* 声明pbar_value类型为浮点变量,就是含有小数点的数值,而且设定初始值为0 */
pbar_value = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
/* 在pbar_value原有值的基础上加上0.01 */
if (pbar_value > 1.0) {
pbar_value = 0;
}
/* 当pbar_value大于1时,就重设值为0, 这样会使进度条无限循环 */
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), pbar_value);
/* 更新进度条,pbar_value值就是决定蓝色进度条的长度 */
return TRUE;
}
void
destroy_progress (GtkWidget *widget, ProgressData *pdata)
{
g_source_remove (pdata->timer);
pdata->timer = 0;
pdata->window = NULL;
g_free (pdata);
/* 释放内存 */
gtk_main_quit ();
}
/* 程序主体 */
int
main (int argc, char *argv[])
{
ProgressData *pdata;
gtk_init (&argc, &argv);
pdata = g_malloc (sizeof (ProgressData));
/* 为传递到回调函数中的数据分配内存 */
pdata->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (pdata->window), "进度条progressbar");
/* 为窗口顶部加上标题为templet3 */
gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 50);
/* 简单的理解是将窗口变成容器,可以装入其它构件,构件边缘与窗口边缘的距离为50像数 */
g_signal_connect (G_OBJECT (pdata->window), "destroy", G_CALLBACK (destroy_progress), pdata);
pdata->pbar = gtk_progress_bar_new ();
/* 创建新的进度条 */
gtk_container_add (GTK_CONTAINER(pdata->window), pdata->pbar);
/* 将进度条装入窗口容器 */
gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
/* 设置进度条的属性是可以显示文字 */
gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar), "Some Text");
/* 设置进度条的显示文字的内容是Some Text */
pdata->timer = g_timeout_add (200, progress_timeout, pdata);
/* 加一个定时器每隔200毫秒就运行一次progress_timeout程序 */
gtk_widget_show_all (pdata->window);
gtk_main ();
return 0;
}
效果图如下