g_snprintf(buf,20,"Item %d",count++); //将新消息加到状态栏 gtk_statusbar_push(GTK_STATUSBAR(status_bar),GPOINTER_TO_INT(data),buf); return; void pop_item(GtkWidget *widget,gpointer data) //删除在栈中给定上下文标识符最上面的一个消息 gtk_statusbar_pop(GTK_STATUSBAR(status_bar),GPOINTER_TO_INT(data)); return; int main(int argc, char*argv[]) GtkWidget *window; GtkWidget *button; GtkWidget *vbox; gint context_id; //初始化GTK gtk_init(&argc,&argv); //创建最上层主窗口 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); //连接信号"delete_event",使得窗口关闭时发生 g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL); //设置窗口标题 gtk_window_set_title(GTK_WINDOW(window),"GTK 状态栏工具"); //设定窗口的默认宽高 //gtk_window_set_default_size(GTK_WINDOW(window),200,300); //设定窗口的位置,让窗口总在最前端 gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); //设定容器边框的宽度 gtk_container_set_border_width(GTK_CONTAINER(window),20); vbox = gtk_vbox_new(FALSE,1); gtk_container_add(GTK_CONTAINER(window),vbox); gtk_widget_show(vbox); //创建一个状态栏 status_bar = gtk_statusbar_new(); gtk_box_pack_start(GTK_BOX(vbox),status_bar,TRUE,TRUE,0); gtk_widget_show(status_bar); //获得上下文的标识符 context_id = gtk_statusbar_get_context_id(GTK_STATUSBAR(status_bar),"Statusbar example"); button = gtk_button_new_with_label("push_item"); g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(push_item),GINT_TO_POINTER(context_id)); gtk_box_pack_start(GTK_BOX(vbox),button,TRUE,TRUE,2); gtk_widget_show(button); button = gtk_button_new_with_label("pop last item"); g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(pop_item),GINT_TO_POINTER(context_id)); gtk_box_pack_start(GTK_BOX(vbox),button,TRUE,TRUE,2); gtk_widget_show(button); gtk_widget_show_all(window); gtk_main(); return FALSE;

文本输入构件 Text Entries
文本输入构件(Entry widget)允许在一个单行文本框里输入和显示一行文本。文本可以用函数进行操作,如将新的文本替换、前插、追加到文本输入构件的当前内容中。

void on_button_clicked (GtkWidget* button,gpointer data) /*void gtk_entry_set_text(Gtk_Entry *entry,const gchr *text) * 将新的内容取代文本输入构件当前的内容。 *const gchar *gtk_entry_get_text(GtkEntry *entry) * 获得当前文本输入构件的内容 if((int)data == 1){ gtk_entry_set_text(GTK_ENTRY(entry1),""); gtk_entry_set_text(GTK_ENTRY(entry2),""); } else if ((int)data == 2){ const gchar* username = gtk_entry_get_text(GTK_ENTRY(entry1)); const gchar* password = gtk_entry_get_text(GTK_ENTRY(entry2)); g_print("用户名是:%s",username); g_print("\n"); g_print("密码是:%s\n",password); } else if((int)data == 3){ /*改变文本空的可编辑状态*/ gtk_editable_set_editable(GTK_EDITABLE(entry1),GTK_TOGGLE_BUTTON(button)->active); gtk_editable_set_editable(GTK_EDITABLE(entry2),GTK_TOGGLE_BUTTON(button)->active); int main(int argc,char* argv[]) GtkWidget* window; GtkWidget* box; GtkWidget* box1; GtkWidget* box2; GtkWidget* box3; GtkWidget* label1; GtkWidget* label2; GtkWidget* button; GtkWidget* sep; //初始化 gtk_init(&argc,&argv); //设置窗口 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL); gtk_window_set_title(GTK_WINDOW(window),"登录窗口"); gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(window),20); box = gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(window),box); box1 = gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(box),box1,FALSE,FALSE,5); box2 = gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(box),box2,FALSE,FALSE,5); sep = gtk_hseparator_new();//分割线 gtk_box_pack_start(GTK_BOX(box),sep,FALSE,FALSE,5); box3 = gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(box),box3,TRUE,TRUE,5); label1 = gtk_label_new("用户名:"); entry1 = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(box1),label1,FALSE,FALSE,5); gtk_box_pack_start(GTK_BOX(box1),entry1,FALSE,FALSE,5); label2 = gtk_label_new("密 码:"); entry2 = gtk_entry_new(); /*设置输入文本不可见*/ gtk_entry_set_visibility(GTK_ENTRY(entry2),FALSE); gtk_box_pack_start(GTK_BOX(box2),label2,FALSE,FALSE,5); gtk_box_pack_start(GTK_BOX(box2),entry2,FALSE,FALSE,5); button = gtk_check_button_new_with_label("Editable"); g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),(gpointer)3); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),TRUE); gtk_box_pack_start(GTK_BOX(box3),button,TRUE,TRUE,10); gtk_widget_show(button); button = gtk_button_new_with_label("清空"); g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),(gpointer)1); gtk_box_pack_start(GTK_BOX(box3),button,TRUE,TRUE,10); gtk_widget_show(button); button = gtk_button_new_with_label("确认"); g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),(gpointer)2); g_signal_connect_swapped(G_OBJECT(button),"clicked",G_CALLBACK(gtk_widget_destroy),window); gtk_box_pack_start(GTK_BOX(box3),button,TRUE,TRUE,5); gtk_widget_show(button); gtk_widget_show_all(window); gtk_main(); return FALSE;

组合框 Combo Box
组合框(combo box)是另一个很简单的构件,实际上它仅仅是其它构件的集合。从用户的观点来说,这个构件是由一个文本输入构件和一个下拉菜单组成的,用户可以从一个预先定义的列表里面选择一个选项,同时,用户也可以直接在文本框里面输入文本.

printf("组合框发生改变\n"); if((int)data == 1){ gchar *ptr = gtk_entry_get_text(GTK_ENTRY(button)); printf("组合框A发生改变,内容是:%s\n",ptr); }else if((int)data == 2) { gchar *ptr = gtk_entry_get_text(GTK_ENTRY(button)); printf("组合框A发生改变,内容是:%s\n",ptr); GtkWidget *create_item (gint i) GtkWidget *item; GtkWidget *label; GtkWidget *hbox; GtkWidget *image; hbox = gtk_hbox_new(FALSE,0); switch(i){ case 1: image = gtk_image_new_from_stock(GTK_STOCK_YES,GTK_ICON_SIZE_MENU); label = gtk_label_new("列表项一"); break; case 2: image = gtk_image_new_from_stock(GTK_STOCK_NO,GTK_ICON_SIZE_MENU); label = gtk_label_new("列表项二"); break; case 3: image = gtk_image_new_from_stock(GTK_STOCK_HELP,GTK_ICON_SIZE_MENU); label = gtk_label_new("列表项三"); break; case 4: image = gtk_image_new_from_stock(GTK_STOCK_OK,GTK_ICON_SIZE_MENU); label = gtk_label_new("列表项四"); break; case 5: image = gtk_image_new_from_stock(GTK_STOCK_CANCEL,GTK_ICON_SIZE_MENU); label = gtk_label_new("列表项五"); break; gtk_box_pack_start(GTK_BOX(hbox),image,FALSE,FALSE,2); gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,2); item = gtk_list_item_new(); gtk_container_add(GTK_CONTAINER(item),hbox); gtk_widget_show_all(item); return item; int main(int argc,char* argv[]) GtkWidget *window; GtkWidget *combo; GtkWidget *label; GtkWidget *vbox; GList *items = NULL; GtkWidget *item; items =g_list_append(items,"列表项A"); items =g_list_append(items,"列表项B"); items =g_list_append(items,"列表项C"); items =g_list_append(items,"列表项D"); items =g_list_append(items,"列表项E"); gtk_init(&argc,&argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL); gtk_window_set_title(GTK_WINDOW(window),"下拉列表框"); gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(window),20); vbox = gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(window),vbox); label = gtk_label_new("组合框A"); gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,5); combo = gtk_combo_new(); gtk_box_pack_start(GTK_BOX(vbox),combo,FALSE,FALSE,5); gtk_combo_set_popdown_strings(GTK_COMBO(combo),items); g_signal_connect(G_OBJECT(GTK_COMBO(combo)->entry),"changed",G_CALLBACK(callback),(gpointer)1); /************************另一种创建的方式******************************/ label = gtk_label_new("组合框B"); gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,5); combo = gtk_combo_new(); gtk_box_pack_start(GTK_BOX(vbox),combo,FALSE,FALSE,5); item = create_item(1); gtk_combo_set_item_string(GTK_COMBO(combo),GTK_ITEM(item),"项目一"); gtk_container_add(GTK_CONTAINER(GTK_COMBO(combo)->list),item); item = create_item(2); gtk_combo_set_item_string(GTK_COMBO(combo),GTK_ITEM(item),"项目二"); gtk_container_add(GTK_CONTAINER(GTK_COMBO(combo)->list),item); item = create_item(3); gtk_combo_set_item_string(GTK_COMBO(combo),GTK_ITEM(item),"项目三"); gtk_container_add(GTK_CONTAINER(GTK_COMBO(combo)->list),item); item = create_item(4); gtk_combo_set_item_string(GTK_COMBO(combo),GTK_ITEM(item),"项目四"); gtk_container_add(GTK_CONTAINER(GTK_COMBO(combo)->list),item); item = create_item(5); gtk_combo_set_item_string(GTK_COMBO(combo),GTK_ITEM(item),"项目五"); gtk_container_add(GTK_CONTAINER(GTK_COMBO(combo)->list),item); g_signal_connect(G_OBJECT(GTK_COMBO(combo)->entry),"changed",G_CALLBACK(callback),(gpointer)2); gtk_widget_show_all(window); gtk_main(); return FALSE; 文本 视图控件( Gtk TextView)是用以取代原有的 文本 编辑( Gtk Text)控件的,它包括一个 文本 缓冲区( Gtk TextBuffer),用来保存 文本 控件显示的带有标记性的文字,且一个缓冲区支持多个显示;缓冲区 文本 的迭代( Gtk TextIter),用来替代缓冲区的某一位置(首部、尾部、某一行等),以便向其中插入数据或控件;缓冲区的书签( Gtk TextMark),表示缓冲区中的某一具体位置,以便进行滚动操作;缓冲区的 文本 标记( Gtk TextTag) 只针对4.5.0版本。 GTK 文本 输入 部件和 输入 法的关系,是通过 Gtk IMMulticontext关联的,所以需要理解这个 问题就需要知道 Gtk IMMulticontext的执行过程。 在 Gtk IMMulticontext被创建的时候,默认的 输入 法就被设置好了,可以用以下的 关键代码来验证这一点: Gtk IMContext* im = gtk _im_multicontext_new(); g_print( gtk _im_multicontext_get_context_id( GTK _IM_MULTICONTE GTK +图形化应用程序开发学习笔记(二十一)— 文本 构建 文本 也叫多行 文本 输入框 ,是 gtk +较常用的 构件 ,也是较复杂的一个 构件 。它被分为以下几部分: Gtk TextView:代表了窗口中可见的 文本 ,用来显示 Gtk TextBuffer. Gtk TextBuffer: 文本 正文的缓冲区, 文本 文字的插入、删除都是对这一类变量进行操作。 Gtk TextIter:保存文字在buffe 以下 gtk + 编程 例子是来自书籍《实用技术:开发Linux应用——用 GTK +和GDK开发Linux图形用户界面应用》第92页的内容—— 架 设置 架标签居中的坐标是0.5,0,这个知识没有太大难度,容易理解 从网上搜索关于中国水电站的图片统一修改成400X300的格式 gimp——文件——打开——找到hydroelectric01.jpg gimp——图像——缩放图像——高度 输入 300后马上回车,注意是高度高度——缩放 gimp——图像——画布大小——单击宽度 输入框 右旁边的圆形针图标让它上下开裂,意思是不锁定 四、 文本 缓冲区 文本 的获得和设置       我们可以用函数 gtk _text_buffer_get_text来获得 文本 缓冲区的 文本 ,用 gtk _text_buffer_set_text来设置它。 10.名称:: gtk _text_buffer_get_text功能: 文本 缓冲区 文本 的获得头文件: 通过上一小节,基本上掌握了如何向窗口中添加菜单栏以及为menu_item添加快捷键,下面我们通过一个实例来创建选择菜单选项. Gtk CHeckMenuItem就是一个可以生成带有选择的菜单选项. 下面看一下代码: #include < gtk / gtk .h> void toggle_statusbar( Gtk Widget *widget,gpointer statusbar){ 输入 小部件是单行 文本 输入 小部件。如果 输入 文本 长于窗口小部件的分配,窗口小部件将滚动以使光标位置可见。 可以使用此类的set_visibility()方法以密码模式转换 输入 字段。 输入 文本 替换为invisible_char()方法选择的字符,默认为'*'。 Entry类具有以下构造函数- gtk .Entry(max = 0) 在此,max表示 输入 字段的最大长度(以字符为单位)。该参数采用... Gtk ::Window, Gtk ::Fixed, Gtk ::Label, Gtk ::Button, Gtk ::RadioButton, Gtk ::Image, Gtk ::TextTable, Gtk ::Entry。 1. 前提准备 using namespace Gtk ; // 使用域名空间 2. gtk 窗体 window->set_decorated(false); // 删除窗体的头 window