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