Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2030838
  • 博文数量: 433
  • 博客积分: 918
  • 博客等级: 准尉
  • 技术积分: 3218
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 18:21
个人简介

你是不是暗恋我,那就给我发个消息呀,让我知道o(∩∩)o

文章分类

全部博文(433)

分类: LINUX

2012-11-28 11:20:33

多行文本编辑器

文本构件总览---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
阅读(4526) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~