Chinaunix首页 | 论坛 | 博客
  • 博客访问: 472366
  • 博文数量: 88
  • 博客积分: 1677
  • 博客等级: 上尉
  • 技术积分: 667
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-03 22:17
文章分类

全部博文(88)

文章存档

2013年(1)

2012年(18)

2011年(69)

分类: 嵌入式

2011-11-25 17:00:49

1 GtkText构件

    GtkText(文本构件)允许多行显示或编辑文本,它支持多种颜色以及多种字体的文本,允许它们以混合显示,支持完全的剪切 /粘贴功能,还包括双击选择一个单词和三击选择整行的功能。同时,它还具有许多预设的键盘快捷键,可用于常用的编辑、移动和选择等功能

注意:现在的Gtk+中默认不支持GtkText构件,而使用GtkTextView构件来代替。如果要使用GtkText构件,则必须在包含gtk.h头文件前定义GTK_ENABLE_BROKEN(#define GTK_ENABLE_BROKEN)

1.1 创建、配置文本构件

  1. gtk_text_new:创建文本构件,其参数允许为文本构件指定水平和垂直的调整对象,并且可以用于跟踪构件的位置。向gtk_text_new函数传递NULL,函数会为文本构件创建自己的调整对象。
  2. gtk_text_set_adjustments可以用来指定其水平和垂直的调整对象
  3. 当文本构件中的文本超过构件能显示的范围时,文本构件不会自动显示滚动条。所以我们必须另行创建滚动条
    vscrollbar = gtk_vscrollbar_new(GTK_TEXT(text)->vadj)
  4. gtk_text_set_editable可用来设置构件是否可编辑
  5. 文本构件在文本如果太长,一行显示不下时会换行。缺省方式是换行后会将单词分成两半。可以用以下函数gtk_text_set_word_wrap来改变

1.2 文本编辑

  1. gtk_text_set_point:设置文本构件的插入点
  2. gtk_text_get_point:获得文本构件的插入点
  3. gtk_text_get_length:返回当前文本的长度。长度是整个文本的字符数,其中包括换行符
  4. gtk_text_insert:在当前点插入指定文本,其length参数为-1时将插入整个字符串
  5. gtk_text_backward_delete:删除当前插入点后指定个数的字符串
  6. gtk_text_forward_delete:删除当前光标前指定个数的字符
  7. gtk_editable_get_chars:获取文本构件中的一段文本。参数end_pos设为-1指明文本的尾部。注意,索引值是从 0开始的。这个函数为文本分配一段内存,所以使用结束后别忘了用 g_free释放内存

    文本构件是一种动态重绘自身的构件 ,它会在 gtk_main( )函数之外重绘构件。这意味着文本构件内的所有变化都会立即生效。如果文本构件内的变化很多时,可能会引起闪烁。要在文本构件内的文本变化较大时不让构件重绘,可以先“冻结”构件,临时停止动态重绘本身,等构件内的更新结束时,再将构件“解冻”。相关函数为:

  1. gtk_text_freeze用来将构件“冻结”,停止其自动重绘,此时GtkText构件内显示的内容将不会被更新
  2. gtk_text_thaw用来为构件“解冻”,使其恢复自动更新功能

2 单行文本框GtkEntry

2.1 文本框操作

  • gtk_entry_new:创建文本框
  • gtk_entry_new_with_max_length:创建一个定长的文本框
  • gtk_entry_get_text:获取文本框内文本
  • gtk_entry_set_text:设置文本框内文本
  • gtk_entry_append_text:往编辑框添加字符串(从后面添加)
  • gtk_entry_prepend_text:往编辑框内添加字符串(从前面添加)
  • gtk_entry_set_editable:设置编辑框是否可编辑

2.2 单行文本框的使用


==========================================================================
定义单行文本框
entry=gtk_entry_new_with_max_length(50);
gtk_entry_set_text(GTK_ENTRY(entry),"hello");
gtk_entry_select_region(GTK_ENTRY(entry),0,GTK_ENTRY(entry)->text_length);
gtk_box_pack_start(GTK_BOX(vbox),entry,TRUE,TRUE,0);
g_signal_connect((GtkEntry*)entry,"activate",G_CALLBACK(OnEnter),NULL);
gtk_widget_show(entry);

================================================================================
将文本框设置成密码输入框
gtk_entry_set_visibility(entry,FALSE);

================================================================================
信号处理(在单行文本框中按回车时产生activate信号)
g_signal_connect(GTK_ENTRY(entry),"activate",G_CALLBACK(entry_handle),NULL);

================================================================================

2.3 图片

3 标签

  • gtk_label_new:创建标签
  • gtk_label_set:设置标签文本
  • gtk_label_get:获得标签文本
  • gtk_label_set_use_markup:是否对标签中的内容采用解析标记语言的办法进行解析
  • gtk_label_set_line_wrap:设置标签中的文本是否换行

4 文本框构件的创建

#include #define GTK_ENABLE_BROKEN #include void text_toggle_editable(GtkToggleButton *checkbutton,gpointer text) { gtk_text_set_editable(GTK_TEXT(text),checkbutton->active); } void text_toggle_word_wrap(GtkToggleButton* checkbutton,gpointer text) { gtk_text_set_word_wrap(GTK_TEXT(text),checkbutton->active); g_print("%d",checkbutton->active); } void close_application(gpointer data) { gtk_main_quit(); } int main(int argc,char** argv) { GtkWidget *window,*box1,*box2,*hbox,*button,*check,*separator; GtkWidget *table,*vscrollbar,*text; GdkColormap *cmap; GdkColor color; GdkFont *fixed_font; FILE* infile; gtk_init(&argc,&argv); window=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window),"文本构件"); gtk_widget_set_usize(window,600,500); gtk_window_set_policy(GTK_WINDOW(window),TRUE,TRUE,FALSE); g_signal_connect(window,"destroy",G_CALLBACK(close_application),NULL); gtk_container_set_border_width(GTK_CONTAINER(window),0); box1=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(window),box1); gtk_widget_show(box1); box2=gtk_vbox_new(FALSE,10); gtk_container_set_border_width(GTK_CONTAINER(box2),10); gtk_box_pack_start(GTK_BOX(box1),box2,TRUE,TRUE,0); gtk_widget_show(box2); table=gtk_table_new(2,2,FALSE); gtk_table_set_row_spacing(GTK_TABLE(table),0,2); gtk_table_set_col_spacing(GTK_TABLE(table),0,2); gtk_box_pack_start(GTK_BOX(box2),table,TRUE,TRUE,0); gtk_widget_show(table); /* 创建GtkText构件 */ text=gtk_text_new(NULL,NULL); gtk_text_set_editable(GTK_TEXT(text),TRUE); gtk_table_attach(GTK_TABLE(table),text,0,1,0,1,GTK_EXPAND | GTK_SHRINK | GTK_FILL,GTK_EXPAND | GTK_SHRINK | GTK_FILL,0,0); gtk_widget_show(text); /* 给GtkText添加垂直滚动条 */ vscrollbar=gtk_vscrollbar_new(GTK_TEXT(text)->vadj); gtk_table_attach(GTK_TABLE(table),vscrollbar,1,2,0,1,GTK_FILL,GTK_EXPAND | GTK_SHRINK | GTK_FILL,0,0); gtk_widget_show(vscrollbar); /* 取得系统颜色映射,将映射设置为红色 */ cmap=gdk_colormap_get_system(); color.red=0xffff; color.green=0; color.blue=0; if(!gdk_color_alloc(cmap,&color)){ g_error("could not allocate color\n"); } /*加载固定字体 */ fixed_font=gdk_font_load("-misc-fixed-medium-r-*-*-*-140-*-*-*-*-*-*"); /* 实现文本构件,可以插入一些文本了 */ gtk_widget_realize(text); /*冻结text构件,准备多行更新 */ gtk_text_freeze(GTK_TEXT(text)); /* Insert some colored text */ gtk_text_insert(GTK_TEXT(text),NULL,&text->style->black,NULL,"supports ",-1); gtk_text_insert(GTK_TEXT(text),NULL,&color,NULL,"colored ",-1); gtk_text_insert(GTK_TEXT(text),NULL,&text->style->black,NULL,"text and different ",-1); gtk_text_insert(GTK_TEXT(text),fixed_font,&text->style->black,NULL,"fonts\n\n ",-1); /* 加载文件 */ infile=fopen("text.c","r"); if(infile){ char buffer[1024]; int nchars; while(1){ nchars=fread(buffer,1,1024,infile); gtk_text_insert(GTK_TEXT(text),fixed_font,NULL,NULL,buffer,nchars); if(nchars<1024) break; } fclose(infile); } /* 将text构件解冻,让变化显示出来 */ gtk_text_thaw(GTK_TEXT(text)); /*创建按钮组合框 */ hbox=gtk_hbutton_box_new(); gtk_box_pack_start(GTK_BOX(box2),hbox,FALSE,FALSE,0); gtk_widget_show(hbox); /* 创建Editable按钮 */ check=gtk_check_button_new_with_label("Editable"); gtk_box_pack_start(GTK_BOX(hbox),check,FALSE,TRUE,0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),TRUE); g_signal_connect(check,"toggled",G_CALLBACK(text_toggle_editable),text); gtk_widget_show(check); /* 创建Wrap按钮 */ check=gtk_check_button_new_with_label("Wrap Words"); gtk_box_pack_start(GTK_BOX(hbox),check,FALSE,TRUE,0); g_signal_connect(check,"toggled",G_CALLBACK(text_toggle_word_wrap),text); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),FALSE); gtk_widget_show(check); /* 创建分隔条*/ separator=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(box1),separator,FALSE,TRUE,0); gtk_widget_show(separator); box2=gtk_vbox_new(FALSE,10); gtk_container_set_border_width(GTK_CONTAINER(box2),10); gtk_box_pack_start(GTK_BOX(box1),box2,FALSE,TRUE,0); gtk_widget_show(box2); /* 创建关闭按钮*/ button=gtk_button_new_with_label("close"); g_signal_connect(button,"clicked",G_CALLBACK(close_application),NULL); gtk_box_pack_start(GTK_BOX(box2),button,TRUE,TRUE,0); /*设置关闭按钮为默认按钮 */ GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT); gtk_widget_grab_default(button); gtk_widget_show(button); gtk_widget_show(window); gtk_main(); return 0; }

阅读(2939) | 评论(0) | 转发(1) |
0

上一篇:调整对象

下一篇:列表框

给主人留下些什么吧!~~