Composants divers des composants GTK (2)

Composants divers des composants GTK (2)

1. barre de progression barre de progression

  Une barre de progression est utilisée pour afficher l'état d'une opération en cours. Créez une fonction de barre de progression comme suit :

GtkWidget*gtk_progress_bar_new (void)

  Une fois la barre de progression créée avec succès, les fonctions suivantes peuvent être utilisées pour définir l'échelle d'affichage de la barre de progression et obtenir le pourcentage de la barre de progression.

/*获取进度条百分比*/
gdouble gtk_progress_bar_get_fraction (GtkProgressBar *pbar)
/*设置进度条百分比*/
void gtk_progress_bar_set_fraction (GtkProgressBar *pbar,gdouble fraction)
参数:fraction为进度条比例,取值范围为0.0~1.0

  GTK version 1.2 a ajouté une nouvelle fonctionnalité à la barre de progression qui lui permet d'afficher sa valeur de différentes manières et d'informer l'utilisateur de sa valeur et de sa plage actuelles. La barre de progression peut définir sa direction de déplacement avec la fonction suivante :

/*设置进度条移动方向*/
void gtk_progress_bar_set_orientation (GtkProgressBar *pbar, GtkOrientation  orientation)
orientation可填以下参数:
GTK_PROGRESS_LEFT_TO_RIGHT 从左向右
GTK_PROGRESS_RIGHT_TO_LEFT 从右向左
GTK_PROGRESS_BOTTOM_TO_TOP 从下向上
GTK_PROGRESS_TOP_TO_BOTTOM 从上向下
/*获取进度条移动方向*/
int gtk_progress_bar_get_orientation(GtkProgressBar *pbar, GtkOrientation)

  En plus d'indiquer la quantité de progrès qui s'est produite, la barre de progression peut également être configurée pour indiquer simplement qu'il y a une activité en cours, c'est-à-dire un état actif. Ceci est utile dans les cas où les progrès ne peuvent pas être mesurés numériquement. Utilisez la fonction suivante pour indiquer que des progrès ont été réalisés.

//设置活动的比例
void gtk_progress_bar_set_pulse_step (GtkProgressBar *pbar,gdouble  fraction)
void gtk_progress_bar_pulse (GtkProgressBar *pbar)

  Définissez l'affichage du texte de la barre de progression et obtenez les informations sur la chaîne de texte.

void gtk_progress_bar_set_text (GtkProgressBar *pbar,const gchar  *text)
const gchar*gtk_progress_bar_get_text (GtkProgressBar *pbar)

2. Exemple de barre de progression

insérez la description de l'image ici

#include <gtk/gtk.h>
#include <stdio.h>
#define TOGGLE_SHOW 1 //文本显示
#define TOGGLE_DIRECTION 2 //方向按钮
#define TOGGLE_ACTIVE 3 //激活按钮
typedef struct
{
    
    
	GtkWidget *window;/*窗口*/
	GtkWidget *pbar;/*进度条*/
	gint timer;/*定时器标志*/
	gint bar_active;
	gint bar_show_stat;//进度条文本显示标志
}gtk_progress;
gtk_progress *pdata=NULL;

/*窗口关闭处理函数*/
void window_destroy_callback(GtkWidget *widget,gpointer data)
{
    
    
	/*销毁定时器*/
	gtk_timeout_remove(pdata->timer);
	pdata->timer=0;
	pdata->window=NULL;
	g_free(pdata);//释放资源
	/*销毁窗口*/
	gtk_main_quit();

}
/*定时器超时处理函数*/
gboolean progress_timeout(gpointer data)
{
    
    
	gtk_progress *pdata=(gtk_progress *)data;
	gdouble new_val;
	gchar buff[20];
	if(pdata->bar_active)//暂停进度条
	{
    
    
		gtk_progress_bar_pulse(GTK_PROGRESS_BAR (pdata->pbar));
		return TRUE;//返回TRUE表示可以继续调用
	}
	new_val=gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR (pdata->pbar));//获取进度条数值
	new_val+=0.01;
	if(new_val>1.0)new_val=0.0;
	if(pdata->bar_show_stat)
	{
    
    
		snprintf(buff,sizeof(buff),"百分比:%d %%",(gint)(new_val*100));
		gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar), buff);//设置进度条文本
	}
	gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR (pdata->pbar),new_val);//设置进度条值
	return TRUE;
}
/*按钮处理函数*/
void check_button_callback(GtkWidget *widget,gpointer data)
{
    
    
	gint flag=(gpointer)data;
	/*获取按钮状态*/
	if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
	{
    
    
		switch(flag)
		{
    
    
			case TOGGLE_SHOW:
				pdata->bar_show_stat=1;//显示文本
			break;
			case TOGGLE_DIRECTION://设置进度条方向为从左往右
				gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR (pdata->pbar), GTK_PROGRESS_RIGHT_TO_LEFT);
			break;
			case TOGGLE_ACTIVE:
				pdata->bar_active=1;//暂停进度条
				//gtk_progress_bar_set_pulse_step(GTK_PROGRESS_BAR (pdata->pbar),0.5);//设置活动的比例
				gtk_progress_bar_pulse(GTK_PROGRESS_BAR (pdata->pbar));
				break;
		}
	}
	else
	{
    
    
		switch(flag)
		{
    
    
			case TOGGLE_SHOW:
				pdata->bar_show_stat=0;//取消显示
				gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar), NULL);//取消文本
			break;
			case TOGGLE_DIRECTION:
				gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR (pdata->pbar), GTK_PROGRESS_LEFT_TO_RIGHT);//设置进度条方向为从左往右
			break;
			case TOGGLE_ACTIVE:
				pdata->bar_active=0;//恢复进度条
				break;
		}
	}
}

int main(int argc,char *argv[])
{
    
    
	GtkWidget *box;
	GtkWidget *alignment;/*对齐构件*/
	GtkWidget *separate;/*分割线*/
	GtkWidget  *table; 
	GtkWidget *button;
	pdata=g_malloc(sizeof(gtk_progress));
	gtk_init(&argc,&argv);
	/*创建窗口*/
	pdata->window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(pdata->window), "GTK PRO_BAR");
	/*设置边框宽度*/
	gtk_container_set_border_width(GTK_CONTAINER(pdata->window), 2);
	/*设置窗口大小是否可以调整*/
	gtk_window_set_resizable(GTK_WINDOW(pdata->window),TRUE);
	/*关联信号*/
	g_signal_connect(G_OBJECT(pdata->window),"destroy", G_CALLBACK(window_destroy_callback),NULL);

	/*创建一个纵向盒*/
	box=gtk_vbox_new(FALSE,5);
	/*将纵向盒放到窗口中*/
	gtk_container_add(GTK_CONTAINER(pdata->window),box);
	gtk_widget_show(box);

	/*创建对齐构件*/
	alignment=gtk_alignment_new(0.5, 0.5, 0.8, 1);
	/*将对齐构件放入纵向盒中*/
	gtk_box_pack_start(GTK_BOX(box),alignment,FALSE,FALSE, 2);
	gtk_widget_show(alignment);

	/*创建进度条*/
	pdata->pbar=gtk_progress_bar_new();
	/*将进度条放入到对齐构件中*/
	gtk_container_add(GTK_CONTAINER(alignment), pdata->pbar);
	gtk_widget_show(pdata->pbar);

	/*
		添加定时器,用户修改进度条的值
			100 --毫秒单位,表示100ms钟触发调用一次progress_timeout
	*/
	pdata->timer=gtk_timeout_add(100,progress_timeout,pdata);

	/*创建水平分割线*/
	separate=gtk_hseparator_new();
	gtk_box_pack_start(GTK_BOX(box),separate, FALSE,FALSE,0);
	gtk_widget_show(separate);

	/*创建2行2列组装表*/
	table=gtk_table_new(2,2,FALSE);
	gtk_box_pack_start(GTK_BOX(box),table, FALSE,TRUE,0);
	gtk_widget_show(table);

	/*创建复选按钮,用于选择进度条文本显示*/
	button=gtk_check_button_new_with_label("显示文本");
	/*将按钮放入组装表中*/
	gtk_table_attach_defaults (GTK_TABLE(table),button,0,1,0,1);
	g_signal_connect(GTK_OBJECT(button),"toggled",G_CALLBACK(check_button_callback), (gpointer)TOGGLE_SHOW);
	gtk_widget_show(button);
	
	/*创建复选按钮,用于调节进度条方向*/
	button=gtk_check_button_new_with_label("方向显示");
	gtk_table_attach_defaults (GTK_TABLE(table),button,0,1,1,2);
	g_signal_connect(GTK_OBJECT(button),"toggled",G_CALLBACK(check_button_callback), (gpointer)TOGGLE_DIRECTION);
	gtk_widget_show(button);
	/*创建复选按钮,用于调节进度条激活和关闭*/
	button=gtk_check_button_new_with_label("暂停加载");
	gtk_table_attach_defaults (GTK_TABLE(table),button,0,1,2,3);
	g_signal_connect(GTK_OBJECT(button),"toggled",G_CALLBACK(check_button_callback), (gpointer)TOGGLE_ACTIVE);
	gtk_widget_show(button);

	/*添加分割线*/
	separate=gtk_hseparator_new();
	gtk_box_pack_start(GTK_BOX(box),separate, FALSE,FALSE,0);
	gtk_widget_show(separate);	

	/*创建按钮,用于退出程序*/
	button=gtk_button_new_from_stock(GTK_STOCK_QUIT);
	gtk_box_pack_start(GTK_BOX(box),button,FALSE,TRUE,0);
	g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(window_destroy_callback),NULL);
	gtk_widget_show(button);	
	gtk_widget_show(pdata->window);
	gtk_main();
	return 0;
}

3. Dialogues Dialogues

  Le widget de dialogue est très simple, en fait c'est juste une fenêtre avec plusieurs widgets pré-assemblés. La structure de données de la boîte de dialogue est :

struct GtkDialog
{
    
    
GtkWindow window;
GtkWidget *vbox;  //纵向盒
GtkWidget *action_area; //横向盒
};

  Comme on peut le voir ci-dessus, la boîte de dialogue crée simplement une fenêtre, assemble une boîte verticale (vbox) sur le dessus, puis assemble un séparateur dans cette boîte verticale, plus une zone d'action appelée "action_area )" boîte horizontale (hbox) .
  Les widgets de dialogue peuvent être utilisés pour les messages contextuels ou d'autres tâches similaires. Voici deux fonctions pour créer une nouvelle boîte de dialogue.

/*创建对话框*/
GtkWidget*gtk_dialog_new (void)
/*创建对话框,可设置多个参数*/
GtkWidget*gtk_dialog_new_with_buttons (const gchar    *title,
                             GtkWindow      *parent,
                             GtkDialogFlags  flags,
                             const gchar    *first_button_text,
                             ...)
形参:title  --对话框标题
      parent  --所属父窗口
      flags   --对话框属性,可填下列一个或多个属性
GTK_DIALOG_MODAL  使对话框使用独占模式。 
GTK_DIALOG_DESTROY_WITH_PARENTS保证对话框在指定父窗口被关闭时也一起关闭。 
GTK_DIALOG_NO_SEPARATOR  省略纵向盒与活动区之间的分隔线 
     first_button_text  --第一个按钮字符文本

4.exemple de dialogue

insérez la description de l'image ici

#include <gtk/gtk.h>
#include <string.h>
GtkWidget *dialog;
GtkWidget *window;

/*按键处理回调函数*/
void button_clicked_callback(GtkWidget *widget,gpointer data)
{
    
    
	char *pada=(gchar *)data;
	if(!strcmp(pada,"on"))
	{
    
    
		gtk_widget_destroy(dialog);//关闭对话框
	}
	if(!strcmp(pada,"ok"))
	{
    
    
		gtk_main_quit();
	}
}
/*窗口按钮处理回调函数*/
void button_callback(GtkWidget *widget,gpointer data)
{
    
    
	GtkWidget *label;
	GtkWidget *button;
	GtkWidget *table;
	#if 0
	dialog=gtk_dialog_new();//创建对话框
	gtk_window_set_title(GTK_WINDOW(dialog),"是否退出");
	#endif
	/*创建对话框,设置对话框模式为独占*/
	dialog=gtk_dialog_new_with_buttons("是否退出",GTK_WINDOW(window),GTK_DIALOG_MODAL,NULL);
	/*创建标签*/
	label=gtk_label_new("是否退出?");
	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),label,TRUE, TRUE,0);
	gtk_widget_show(label);

	/*创建组装表*/
	table=gtk_table_new(1,0,FALSE);
	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area),table,FALSE, FALSE, 0);
	/*创建按钮*/
	button=gtk_button_new_from_stock(GTK_STOCK_NO);
	gtk_table_attach_defaults(GTK_TABLE(table),button,0,1,0,1);
	gtk_widget_show(button);
	g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(button_clicked_callback),"on");
	/*创建按钮*/
	button=gtk_button_new_from_stock(GTK_STOCK_OK);
	gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,0,1);
	g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(button_clicked_callback),"ok");
	gtk_widget_show(button);
	gtk_widget_show(table);
	gtk_widget_show(dialog);
	
}
int main(int argc,char **argv)
{
    
    
	
	GtkWidget *table;
	GtkWidget *button;
	gtk_init(&argc,&argv);
	/*创建窗口*/
	window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window),"GTK");
	gtk_container_set_border_width(GTK_CONTAINER(window), 5);
	gtk_widget_set_usize(window, 200, 200);
	g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit), NULL);
	
	/*创建组装表*/
	table=gtk_table_new(3,4,TRUE);
	gtk_container_add(GTK_CONTAINER(window),table);
	/*创建按钮*/
	button=gtk_button_new_with_label("关闭");
	gtk_table_attach_defaults(GTK_TABLE(table),button,1,3,1,2);
	g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(button_callback), NULL);

	gtk_widget_show(button);
	gtk_widget_show(table);
	gtk_widget_show(window);
	gtk_main();
	return 0;
	
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44453694/article/details/127406359
conseillé
Classement