为了实现部分文字的高亮,开始到网上大搜索,可是找到的也就是
gtk_widget_modify_*一个系列,虽然它可改变控件的前景,背景,但是实现不了部分内部的高亮显示
在网上也找到了,GtkTextView控件能够内嵌图片,有文本标志功能,但是根本没有找到什么实例。
最后我下了一本<GTK+2.0编程范例>电子书,在里面找到了实例。
下面是我根据实例自己写的一部分代码,如果想知道更多的应用方法,可以查看相就的API,
textview1 = gtk_text_view_new ();
gtk_widget_show (textview1);
gtk_container_add (GTK_CONTAINER (scrolledwindow1), textview1);
gtk_text_view_set_editable (GTK_TEXT_VIEW (textview1), FALSE);
GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview1));
gtk_text_buffer_create_tag(buffer,"red_foreground","foreground","red",NULL);
gtk_text_buffer_create_tag(buffer,"yellow_background","background","yellow",NULL);
GtkTextIter end;
/*
gtk_text_buffer_get_end_iter(buffer,&end);
gtk_text_buffer_insert(buffer,&end,"这是一段正常的文字",-1);
gtk_text_buffer_get_end_iter(buffer,&end);
gtk_text_buffer_insert_with_tags_by_name(buffer,&end,"这是一段有前景的标志文字",
-1,"red_foreground",NULL);
gtk_text_buffer_get_end_iter(buffer,&end);
gtk_text_buffer_insert_with_tags_by_name(buffer,&end,"这是一段有背景的标志文字\n",
-1,"yellow_background",NULL);
gtk_text_buffer_get_end_iter(buffer,&end);
gtk_text_buffer_insert_with_tags_by_name(buffer,&end,
"这是一段有前景又有背景的标志文字\n",-1,"yellow_background","red_foreground",NULL);
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file("/root/Desktop/test/image/ image.jpg",
NULL);
gtk_text_buffer_get_end_iter(buffer,&end);
gtk_text_buffer_insert_pixbuf(buffer,&end,pixbuf);
gtk_text_buffer_get_end_iter(buffer,&end);
gtk_text_buffer_insert(buffer,&end,"\n这是一段正常的文字在结束的时候",-1);
*/
#define COLOR "[color]"
#define COLOR_END "[/color]"
#define IMAGE "[image]"
char text_buf[]="现在我们要进行插入大量的文本进的,标志处理,就如部分文字的\
[color]高亮显示[/color]中的高亮显示。\n还有就是图片的定点插入,如下面:\n[image]\n图片\
就是插在如下图的下面,这张图的内部是鸭子";
char *p,*p1,*pc,*pi;
char text_tmp[1024]={0};
p=text_buf;
while(1)
{
if(p != '\0')
{
pc=strstr(p,COLOR);
pi=strstr(p,IMAGE);
}
else
break;
if(pc == 0 && pi == 0)
break;
else if(pi == 0 ||( pc < pi && pi && pc))
{
bzero(text_tmp,sizeof(text_tmp));
strncpy(text_tmp,p,pc-p);
p=pc+strlen(COLOR);
gtk_text_buffer_get_end_iter(buffer,&end);
gtk_text_buffer_insert(buffer,&end,text_tmp,-1);
bzero(text_tmp,sizeof(text_tmp));
if((pc=strstr(p,COLOR_END)))
{
strncpy(text_tmp,p,pc-p);
p=pc+strlen(COLOR_END);
}
else if((pi=strstr(p,IMAGE)))
{
strncpy(text_tmp,p,pi-p);
p=pi+strlen(IMAGE);
}
else
{
strcpy(text_tmp,p);
p='\0';
}
gtk_text_buffer_get_end_iter(buffer,&end);
gtk_text_buffer_insert_with_tags_by_name(buffer,&end,text_tmp,-1,
"red_foreground",NULL);
}
else if(pc== 0 ||(pi<pc && pi && pc))
{
bzero(text_tmp,sizeof(text_tmp));
strncpy(text_tmp,p,pi-p);
p=pi+strlen(IMAGE);
gtk_text_buffer_get_end_iter(buffer,&end);
gtk_text_buffer_insert(buffer,&end,text_tmp,-1);
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(
"/root/Desktop/test/image/ image.jpg",NULL);
gtk_text_buffer_get_end_iter(buffer,&end);
gtk_text_buffer_insert_pixbuf(buffer,&end,pixbuf);
bzero(text_tmp,sizeof(text_tmp));
if((pc=strstr(p,COLOR)))
{
strncpy(text_tmp,p,pc-p);
p=pc+strlen(COLOR);
}
else
{
strcpy(text_tmp,p);
p='\0';
}
gtk_text_buffer_get_end_iter(buffer,&end);
gtk_text_buffer_insert(buffer,&end,text_tmp,-1);
}
}