完成上图红色的功能
首先是glade的设计:
功能说明:
在textview中编辑好文本后,在文件名输入栏输入文件名按回车就可以在指定的路径下保存文件了。
首先是获取textview中的内容,用到的函数是gtk_text_view_get_buffer,就可以得到一个文本缓冲区,用来对文本进行操作,包括插入、删除、更改字体颜色大小等。写入文件要有一个路径比方
char path[100] = "C:\\Users\\liuxi_001\\Desktop\\";
在定义一个变量用来保存文件名,就是entry2输入的文件名 gchar *fileName,这样用函数strcat连接起来就完成了整个的路径 fpath = strcat(path, fileName)。
要用到一个signal就是entry中的activate信号,它是你按回车就会被激活,执行回调函数。entry3和entry4设计成不可编写,只能显示不能更改。
具体看代码:
#include <stdlib.h>
#include <gtk/gtk.h>
/*统计字符数*/
void charsize(GtkWidget *textbuff, GtkWidget *entry4)
{
int charsize ;
char ccharsize[4];
charsize = gtk_text_buffer_get_char_count (GTK_TEXT_BUFFER(textbuff));
itoa(charsize, ccharsize, 10);
gtk_entry_set_text (GTK_ENTRY(entry4), ccharsize);
}
/*统计行数*/
void linesize(GtkWidget *textbuff, GtkWidget *entry3)
{
int linesize ;
char clinesize[4];
linesize = gtk_text_buffer_get_line_count (GTK_TEXT_BUFFER(textbuff));
itoa(linesize, clinesize, 10);
gtk_entry_set_text (GTK_ENTRY(entry3), clinesize);
}
/*保存功能*/
void saveFile(GtkWidget *entry2, GtkWidget *textview)
{
FILE *fp;
gchar *fpath;
gchar *text;
GtkTextIter start, end;
GtkTextBuffer *textbuff;
gchar *fileName;
char path[100] = "C:\\Users\\liuxi_001\\Desktop\\";
fileName= gtk_entry_get_text(GTK_ENTRY(entry2));
fpath = strcat(path, fileName);
fp = fopen(fpath, "wb");
textbuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
gtk_text_buffer_get_bounds(textbuff, &start, &end);
text = gtk_text_buffer_get_text(textbuff, &start, &end, TRUE);
fputs(text, fp);
fclose(fp);
}
int main (int argc, char *argv[])
{
GtkWidget *win;
GtkBuilder *builder;
GtkWidget *entry2;
GtkWidget *entry3;
GtkWidget *entry4;
GtkWidget *textview1;
/*这些是固定格式*/
gtk_init (&argc, &argv);
builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "test.glade", NULL);
gtk_builder_connect_signals (builder, NULL);
/*从test.glade文件中获得window1,注意其他的组建也可以按这个格式获得*/
win = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
entry2 = GTK_WIDGET (gtk_builder_get_object (builder, "entry2"));
textview1 = GTK_WIDGET (gtk_builder_get_object (builder, "textview1"));
/*保存回调信号*/
g_signal_connect(entry2, "activate", G_CALLBACK(saveFile), textview1);
/*统计行数信号*/
g_signal_connect(textbuff, "changed", G_CALLBACK(linesize), entry3);
/*统计字符数信号*/
g_signal_connect(textbuff, "changed", G_CALLBACK(charsize), entry4);
g_object_unref (G_OBJECT (builder));
gtk_widget_show (win);
gtk_main ();
return 0;
}