Varios componentes de componentes GTK (2)

Varios componentes de componentes GTK (2)

1. barra de progreso barra de progreso

  Se utiliza una barra de progreso para mostrar el estado de una operación en curso. Cree una función de barra de progreso de la siguiente manera:

GtkWidget*gtk_progress_bar_new (void)

  Después de crear correctamente la barra de progreso, se pueden usar las siguientes funciones para configurar la escala de visualización de la barra de progreso y obtener el porcentaje de la barra de progreso.

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

  GTK versión 1.2 ha agregado una nueva función a la barra de progreso que le permite mostrar su valor de diferentes maneras e informar al usuario de su valor y rango actual. La barra de progreso puede establecer su dirección de movimiento con la siguiente función:

/*设置进度条移动方向*/
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)

  Además de indicar la cantidad de progreso que se ha producido, la barra de progreso también se puede configurar para indicar simplemente que hay actividad en curso, es decir, un estado activo. Esto es útil en los casos en que el progreso no se puede medir numéricamente. Utilice la siguiente función para indicar que se han realizado progresos.

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

  Configure la visualización de texto de la barra de progreso y obtenga la información de la cadena de texto.

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

2. Ejemplo de barra de progreso

inserte la descripción de la imagen aquí

#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. Diálogo Diálogos

  El widget de diálogo es muy simple, de hecho es solo una ventana con varios widgets preensamblados en ella. La estructura de datos del diálogo es:

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

  Como se puede ver en lo anterior, el cuadro de diálogo simplemente crea una ventana, ensambla un cuadro vertical (vbox) en la parte superior y luego ensambla un separador en este cuadro vertical, además de un área de acción llamada "action_area )" cuadro horizontal (hbox) .
  Los widgets de diálogo se pueden usar para mensajes emergentes u otras tareas similares. Aquí hay dos funciones para crear un nuevo diálogo.

/*创建对话框*/
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. ejemplo de diálogo

inserte la descripción de la imagen aquí

#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;
	
}

Supongo que te gusta

Origin blog.csdn.net/weixin_44453694/article/details/127406359
Recomendado
Clasificación