⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtk_pbar.c

📁 用GTK+写的一个带进度条的文件copy 主要用到g_iddle_add来回调
💻 C
字号:
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>//malloc
#define BUFSIZE 1024
#define SRC "scmj.zip.s"
char DES[16];
#include <gtk/gtk.h>
#include <string.h>//strcat
#define BUFSIZE 1024
int tmp = 0;//copy后新建文件的名字自增参数
void clean(gpointer data)//释放指针,并退出gtk
{
	free(data);
	gtk_main_quit();
}
typedef struct _tr_data //callback函数传递的指针结构,不想用全局变量^_^
{
	GtkWidget *b;
	GtkWidget *pbar;
	GtkWidget *q;
	int ip;
	int op;
	int count;
	int total;
}tran_data;
int die (char *str)//文件读写失败
{
	printf("%s\n",str);
	return 1;
}
int idle_fuc(gpointer data)//循环
{
	tran_data *td = (tran_data *)(data);
	gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(td->pbar),(float)td->count/td->total);
	char tmp[16];
	sprintf(tmp,"%.2f",(float)td->count*100/(float)td->total);
	strcat(tmp,"%");
	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(td->pbar),tmp);
	int size;
	char *c = malloc(BUFSIZE);
	size = read(td->ip,c,BUFSIZE);
	if(!size)
	{
		gtk_progress_bar_set_text(GTK_PROGRESS_BAR(td->pbar),"Done!");
		gtk_widget_set_sensitive(td->b,TRUE);
		gtk_widget_set_sensitive(td->q,TRUE);
		free(c); 
		return FALSE;
	}
	write(td->op,c,size);
	td->count+=size;
	return TRUE;
}
void button_clicked(gpointer data)//每次button clicked 的时候进行新的一次copy
{
	tmp++;//change destination file name
	tran_data *td = (tran_data *)data;
	td->count = 0; 
	struct stat *buf;
	buf = malloc(sizeof(struct stat));
	lstat(SRC,buf);
	td->total = buf->st_size;
	free(buf);
	sprintf(DES,"%d",tmp);
	strcat(DES,".zip");
	td->ip = open(SRC,O_RDONLY);
	td->op = open(DES,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);
	if(td->ip == -1) 
		die("Open input File Faild");
	if(td->op == -1) 
		die("Open Output File Faild");
	gtk_widget_set_sensitive(td->b,FALSE);//保证在copy的过程中两个按钮不能作其它事情,直到copy完成
	gtk_widget_set_sensitive(td->q,FALSE);
	td->count = 0;
	g_idle_add(idle_fuc,td);//gtk 循环处理调用
}
int main(int argc,char *argv[])//主程序
{
	gtk_init (&argc,&argv);
	GtkWidget *w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_widget_show(w);
	
	GtkWidget *box = gtk_vbox_new(FALSE,0);
	gtk_container_add(GTK_CONTAINER(w),box);
	gtk_widget_show(box);
	
	GtkWidget *b = gtk_button_new_from_stock("gtk-execute");
	gtk_box_pack_start(GTK_BOX(box),b,FALSE,FALSE,0);
	gtk_widget_show(b);
	
	GtkWidget *pbar = gtk_progress_bar_new();
	gtk_box_pack_start(GTK_BOX(box),pbar,FALSE,FALSE,0);
	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pbar),"Click button to start copy");
	
	GtkWidget *q = gtk_button_new_from_stock("gtk-quit");
	gtk_box_pack_start(GTK_BOX(box),q,FALSE,FALSE,0);
	gtk_widget_show(q);
	
	tran_data *td = malloc(sizeof(tran_data));//初始化结构的一些成员,便于在callback函数中传递
	td->b = b;
	td->pbar = pbar;
	td->q = q;
	g_signal_connect_swapped(b,"clicked",G_CALLBACK(button_clicked),td);
	g_signal_connect_swapped(w,"delete_event",G_CALLBACK(clean),td);
	g_signal_connect_swapped(q,"clicked",G_CALLBACK(clean),td);
	gtk_widget_show(pbar);
	
	gtk_main();
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -