GTK 缓冲区

来源:互联网 发布:淘宝刷単平台 编辑:程序博客网 时间:2024/06/10 18:50

转发http://blog.sina.com.cn/s/blog_712a04260101atmq.html

Gtk+ 学习笔记19  --文本框构件

(2013-04-13 22:31:03)
转载
标签:

it

分类: Linux
 

GtkTextView代表了窗口中可见的文本框,用来显示GtkTextBuffer.

GtkTextBuffer:文本框正文的缓冲区,文本框文字的插入、删除都是对这一类变量进行操作。

GtkTextIter保存文字在buffer中位置的结构。

GtkTextMark:A position in the buffer preserved across buffer modifications

GtkTextTag用来给指定的文字添加一些标记,改变指定区域的文字的显示效果。如:字体的颜色、大小的改变。

GtkTextTagTable:是GtkTextTag标记的集合表。


创建文本框构件

GtkTextView 它代表了窗口可见的文本框,有两种方法创建文本框,1)用默认的缓冲区创建文本框,用函数gtk_text_view_new,2)指定缓冲区来创建文本框,用函数gtk_text_view_new_with_buffer。

      gtk_text_view_new 创建一个新的文本框,如果没有在创建之前调用函数gtk_text_view_set_buffer来设置这个缓冲区,系统会创建一个空的默认的缓冲区,而我们可以用gtk_text_view_get_buffer来得到这个缓冲区。同样也可以用指定的缓冲区来创建文本框gtk_text_view_new_with_buffer。

gtk_text_view_new_with_buffer(GtkTextBuffer *buffer)

buffer来指定这个缓冲区,如果buffer为NULL,那功能和gtk_text_view_new函数一样。


创建文本框的缓冲区gtk_text_buffer_new(Gtk_Text_Tag_Table *table),它需要指定文件构件的标签盒,当然也可以为空,让系统创建默认的文件构件标签盒,然后用get_text_buffer_get_tag_table(GtkTextBuffer *buffer)函数来获得标签盒。


文本框文字的插入和删除

对文本框文字的插入和删除之前都需要得到当前buffer中开始位置,结束位置的ITER,用gtk_text_buffer_get_bounds(GtkTextBuffer *buffer, GtkTextIter *start, GtkTextIter *end),

缓冲区开始和结束位置的iter分别通过star和end参数得到。

之后就可以对文本框构件的正文进行操作了,gtk_text_buffer_insert(GtkTextBuffer *buffer, GtkTextIter *iter, const gchar *text ,gint len),向缓冲区插入文字。start,end分别为文本框文字开始位置和结束位置的iter,len是要插入文本的长度,可以是-1,表示插入text的所有内容。


gtk_text_buffer_delete(GtkTextBuffer *buffer, GtkTextIter *start, GtkTextIter *end)缓冲区内容删除。start,end分别为文本框文字开始位置和结束位置的iter。

文本框缓冲区文本的获得和设置

gtk_text_buffer_get_text(GtkTextBuffer *buffer,const GtkTextIter *start,const GtkTextIter *end,gboolean include_hidden_chars)来获得文本框缓冲区的文本;

gtk_text_buffer_set_text(GtkTextBuffer *buffer,const gchar *text,gint len)对文本框缓冲区文本进行设置。会删掉原有缓冲区内容,用text的内容代替。


这是一个例子:








#include

GtkWidget *window;
GtkWidget *view;
GtkTextBuffer *buffer;
GtkTextIter *iter;
GtkWidget *button;
GtkWidget *box;
GtkWidget *button2;

void button_event(GtkWidget *widget, gpointer *data);
void button_event2(GtkWidget *widget, gpointer *data);

int main(int argc, char* argv[])
{
    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_size_request(window,200,200);
    gtk_signal_connect(GTK_OBJECT(window),
            "destroy",
            G_CALLBACK(gtk_main_quit),
            NULL);


    box = gtk_vbox_new(FALSE,0);
    gtk_widget_show(box);

    buffer = gtk_text_buffer_new(NULL);
    view = gtk_text_view_new_with_buffer(buffer);
    gtk_box_pack_start(GTK_BOX(box),view,TRUE,TRUE,10);
    gtk_widget_set_size_request(view,200,150);

    button = gtk_button_new_with_label("enter");
    gtk_signal_connect(GTK_OBJECT(button),
            "clicked",
            GTK_SIGNAL_FUNC(button_event),
            NULL);
    gtk_box_pack_start(GTK_BOX(box),button,TRUE,TRUE,10);
    gtk_widget_show(button);

    button2 = gtk_button_new_with_label("change");
    gtk_signal_connect(GTK_OBJECT(button2),
            "clicked",
            GTK_SIGNAL_FUNC(button_event2),
            NULL);
    gtk_box_pack_start(GTK_BOX(box),button2,FALSE,FALSE,10);
    gtk_widget_show(button2);

    gtk_container_add(GTK_CONTAINER(window),box);
    gtk_widget_show(view);
   
    gtk_widget_show(window);
    gtk_main();
    return 0;
}

void button_event(GtkWidget *widget,gpointer *data)
{
    const gchar *text="HOW ARE YOU !";
    GtkTextIter start,end;
    //获得缓冲区开始和结束位置的Iter
    gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(buffer),&start,&end);
    //插入文本到缓冲区
    gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer),&start,text,strlen(text));
}

void button_event2(GtkWidget *widget, gpointer *data)
{
    gchar *text2;
    const gchar *text3="I AM HERE FOR YOU ! \n";
    GtkTextIter start,end;
   
    gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(buffer),&start,&end);
    const GtkTextIter s=start,e=end;
    text2 = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(buffer),&s,&e,FALSE);
    g_print("%s \n",text2);

    gtk_text_buffer_set_text(GTK_TEXT_BUFFER(buffer),text3,20);

}




参考来源:

http://blog.csdn.net/byxdaz/article/details/3554003

 

0 0