1 GtkText构件
GtkText(文本构件)允许多行显示或编辑文本,它支持多种颜色以及多种字体的文本,允许它们以混合显示,支持完全的剪切 /粘贴功能,还包括双击选择一个单词和三击选择整行的功能。同时,它还具有许多预设的键盘快捷键,可用于常用的编辑、移动和选择等功能
注意:现在的Gtk+中默认不支持GtkText构件,而使用GtkTextView构件来代替。如果要使用GtkText构件,则必须在包含gtk.h头文件前定义GTK_ENABLE_BROKEN(#define GTK_ENABLE_BROKEN)
1.1 创建、配置文本构件
- gtk_text_new:创建文本构件,其参数允许为文本构件指定水平和垂直的调整对象,并且可以用于跟踪构件的位置。向gtk_text_new函数传递NULL,函数会为文本构件创建自己的调整对象。
- gtk_text_set_adjustments可以用来指定其水平和垂直的调整对象
- 当文本构件中的文本超过构件能显示的范围时,文本构件不会自动显示滚动条。所以我们必须另行创建滚动条
vscrollbar = gtk_vscrollbar_new(GTK_TEXT(text)->vadj)
- gtk_text_set_editable可用来设置构件是否可编辑
- 文本构件在文本如果太长,一行显示不下时会换行。缺省方式是换行后会将单词分成两半。可以用以下函数gtk_text_set_word_wrap来改变
1.2 文本编辑
- gtk_text_set_point:设置文本构件的插入点
- gtk_text_get_point:获得文本构件的插入点
- gtk_text_get_length:返回当前文本的长度。长度是整个文本的字符数,其中包括换行符
- gtk_text_insert:在当前点插入指定文本,其length参数为-1时将插入整个字符串
- gtk_text_backward_delete:删除当前插入点后指定个数的字符串
- gtk_text_forward_delete:删除当前光标前指定个数的字符
- gtk_editable_get_chars:获取文本构件中的一段文本。参数end_pos设为-1指明文本的尾部。注意,索引值是从 0开始的。这个函数为文本分配一段内存,所以使用结束后别忘了用 g_free释放内存
文本构件是一种动态重绘自身的构件 ,它会在 gtk_main( )函数之外重绘构件。这意味着文本构件内的所有变化都会立即生效。如果文本构件内的变化很多时,可能会引起闪烁。要在文本构件内的文本变化较大时不让构件重绘,可以先“冻结”构件,临时停止动态重绘本身,等构件内的更新结束时,再将构件“解冻”。相关函数为:
- gtk_text_freeze用来将构件“冻结”,停止其自动重绘,此时GtkText构件内显示的内容将不会被更新
- 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;
}