多行文本编辑器
文本构件总览---GtkTextBuffer,GtkTextView和其它构件概述
GtkTextIter---文本缓冲迭代器
GtkTextMark---缓冲器修改位置记录
GtkTextBuffer---保存要在GtkTextView中显示的文本属性
GtkTextTag---文本标签,用于标记GtkTextBuffer中的文本
GtkTextTagTabel---文本标签表
GtkTextView---用于显示GtkTextBuffer中文本的构件;
概念总述
Gtk+有一个非常强大的构架来处理多行文本。最主要的构件对象是GtkBuffer,其缓冲记忆了正在被编辑的文本。GtkTextView是一个用来显示文件缓冲器中内容的构件。每个缓冲器中的内容都可以被任意多个GtkTextView显示;
一 件重要的事情是要时刻记住GTK+是UTF-8编码为基础的。这意味着字符可被多字节编码。字符数通常用offsets变量标记,同时字节数通常用 indexs来标记。如果你两种记数方式都不使用,在ASCII编码的情况下,一切工作良好,但是不久你就会发现缓冲器包含的多字节字符会使情况变得糟 糕。
缓冲器区中的文本可被'tag'标记。'tag'是可作用于某些文本的属性。例如:被称为“bold”的tag 可用来标记粗体文本。进一步的,tag这个概念不仅仅在于此,它不一定去作用于文本显示上,同时它还会作用于鼠标和键盘的行为;'lock'标记可使被 标记的文本不可编辑。
Tag是通过GtkTextTag对象实现的。一个GtkTextTag可作用于多个缓冲区的任何文本。
每个tag都被保存在GtkTextTable中。一个tag表被定义为可集合使用的构件。每一个缓冲区有一个tag表对应于它。只有对应的tag才能作用于相应的缓冲区。但是,单个tag表可被多个缓冲区共享使用。
Tag可以拥有自已的名字,有时候这是非常方便的。但是你也可以匿名使用一个Tag。
大多数的文本处理与Iterators有关,Gtk中用GtkTextIter。一个iterator代表了文本缓冲区中两个字符之前的位置。 GtkTextIter是被设计为在堆栈中分配内存的。它确保拷贝有效并且绝对不会包含任何堆分配数据。Iterators并不是无限的。当缓冲区被修改 时从而影响到字符。所有的outstanding itertors都变的不再可用(注意,删除5个字符然后重新插入5个字符,itertors仍旧不可用,虽然你以同样的字符数结束,但是传递了一个不同 的状态码)。
因为这个缘故,iterators不可被缓冲区修改用来保持位置记录。为了保持一个修改记录,GtkTextMark是一个理想的选择。你可以将mark想像为一个可见的光标,它闪烁于缓冲区中,保存着修改位置。
如果mark周围的字符被删除掉了,mark同样会保留。如果文本被插入到标签的位置,标签对于新文本来说,即可是左,也可以是右。,取决于它的gravity.标准的文本光标一个从左到右的语言环境中是右极性,因为它新插入的文本在右边。
同tags一样,marks同样可被命名或匿名访问。有两种marks内建于GtkTextBuffer.一个是“inster”,另外一个是 “selection_bound(有限制的)”and refer to the insertion point and the boundary of the selection which is not the insertion point, respectively。如果没有文本被选中,这两种mard处于同一个位置。
你可以计算哪些被选中了,通过移动这些mark确定光标在哪里。
textbuffer中至少保留一行,但是可能为空(即包含0个字符)。缓冲区中的最后一行绝不会以换行符结束。其它行总是经换行符结束。换行符在字符统 计中是有效的字符数。注意有些Unicode换行符是多用UTF-8字节表示的。同时两个字符序列”\r\n”也被认为是一种抽象行符。
简单示例:
The simplest usage of GtkTextView might look like this:
GtkWidget *view;
GtkTextBuffer *buffer;
view = gtk_text_view_new ();
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
gtk_text_buffer_set_text (buffer, "Hello, this is some text", -1);
/* Now you might put the view in a container and display it on the
* screen; when the user edits the text, signals on the buffer
* will be emitted, such as "changed", "insert_text", and so on.
*/
在很多情况下,首先用gtk_text_buffer_new()创建一个缓冲区,然后创建一个widget用 gtk_text_view_new_with_buffer.或者你可以在完成显示后改变用gtk_text_view_set_buffer创建的 widget的缓冲区。
改变文本属性的例子:
有两种方式可改变GtTextView中的文本属性。你可以改变默认属性,或者是你可以用tag改变某些被标记的文本。对于文本属性来说自于主题--比如字体,前景色等。
GtkWidget *view; GtkTextBuffer *buffer; GtkTextIter start, end; PangoFontDescription *font_desc; GdkColor color; GtkTextTag *tag; view = gtk_text_view_new (); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); gtk_text_buffer_set_text (buffer, "Hello, this is some text", -1); /* Change default font throughout the widget */ font_desc = pango_font_description_from_string ("Serif 15"); gtk_widget_modify_font (view, font_desc); pango_font_description_free (font_desc); /* Change default color throughout the widget */ gdk_color_parse ("green", &color); gtk_widget_modify_text (view, GTK_STATE_NORMAL, &color); /* Change left margin throughout the widget */ gtk_text_view_set_left_margin (GTK_TEXT_VIEW (view), 30); /* Use a tag to change the color for just one part of the widget */ tag = gtk_text_buffer_create_tag (buffer, "blue_foreground", "foreground", "blue", NULL); gtk_text_buffer_get_iter_at_offset (buffer, &start, 7); gtk_text_buffer_get_iter_at_offset (buffer, &end, 12); gtk_text_buffer_apply_tag (buffer, tag, &start, &end);gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled),text);/* 将文本视图构件加入滚动窗口*/ 你为什么要用这个函数加组件? 把这句替换为以下语句就解决问题了 gtk_container_add(GTK_CONTAINER(scrolled), text); 你用的那个接口会保存视点信息,推荐你仔细看一看devhelp