菜单构件(menu)
这一节我们是这样设计的:单击主窗口 菜单“文件”下的“打开”子菜单,会弹出一个新窗口。
菜单构件的使用比较简单,只要设计好后,在callbacks.c文件中找到“相应菜单”对应的“函数”,
在里面添加代码就可以了。
我们设计的主菜单有两项,“文件”和“编辑”。“文件”下有:“打开”、“保存”。“编辑”下有:“拷贝”、“粘贴”。
创建菜单构件:
/* 创建菜单构件要用到较多的函数,所辛,Glade会自动生成代码。我们不用管它了*/
这一节用到的新函数:
无
一、用Glade设计界面
步骤: 1、新建glade工程
2、依此放置 窗口(400,300)、固定位置、菜单构件。
3、选中菜单构件,然后在“属性”面版中,单击“编辑菜单”按钮,编辑菜单。
4、编辑菜单时主意:菜单的标签可以使用汉字,菜单的名子要使用英文,否则生成的代码中,
你根本就看不出谁是谁。
5、在工程中,再放置一个窗口构件,在新窗口上放置标签,label属性是“window2”。
6、保存工程,并生成代码。
二、修改代码
对范围构件的原代码做一些修复.
callbacks.h /**/
void on_open1_activate (GtkMenuItem *menuitem,
gpointer user_data);
void on_save1_activate (GtkMenuItem *menuitem,
gpointer user_data);
void on_copy1_activate (GtkMenuItem *menuitem,
gpointer user_data);
void on_pause1_activate (GtkMenuItem *menuitem,
gpointer user_data);
callbacks.c
void on_open1_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
GtkWidget *window2;
window2 = create_window2 ();
gtk_widget_show (window2);
}
void on_save1_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void on_copy1_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void on_pause1_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
interface.c
将 /* GtkWidget *all_label1;*/ 的注释去掉.
callbacks.h
将 GtkWidget *all_label1; 删除.
callbacks.c
在函数 on_hscrollbar1_value_changed 里加上下面一句代码,加在第一行.
GtkWidget *all_label1 = lookup_widget (GTK_WIDGET(range), "all_label1");
在函数 on_vscrollbar1_value_changed 里加上下面一句代码,加在第一行.
GtkWidget *all_label1 = lookup_widget (GTK_WIDGET(range), "all_label1");
这样就可以了.
TextView构件
我们是这样设计的:在窗口上放置一个按钮构件和一个TextView构件,
单击按钮构件,在TextView构件里显示格式话的文本。
TextView构件是这样使用的:TextView构件要和TextBuffer构件结合使用。
在TextBuffer构件里定义并存储“格式化的文本”,然后在TextView构件里
显示出来。
所以使TextView构件显示格式化的文本需要三个步骤:
1、定义“格式化文本”(在TextBuffer里)。
2、存储“格式化文本”(在TextBuffer里)。
3、显示“格式化文本”(在TextView里)
这一节里:定义“格式化文本”,写了一个单独的函数create_tags,
存储“格式化文本”,写了一个单独的函数insert_text,
一、用Glade设计界面,给按钮构件添加clicked信号响应。
二、添加代码。
callbacks.c
/*函数:定义格式化文本*/
static void
create_tags (GtkTextBuffer *buffer)
{
gtk_text_buffer_create_tag (buffer, "bold",
"weight", PANGO_WEIGHT_BOLD, NULL);
gtk_text_buffer_create_tag (buffer, "blue_foreground",
"foreground", "blue", NULL);
gtk_text_buffer_create_tag (buffer, "red_background",
"background", "red", NULL);
/*
参数的含义: "red_background" ,格式化文本的名字。"background", "red", 格式化文本的属性。
*/
}
/*函数:存储格式化文本*/
static void
insert_text (GtkTextBuffer *buffer)
{
GtkTextIter iter;
GtkTextIter start, end;
gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
gtk_text_buffer_insert (buffer, &iter, "The text widget can display Richtext./n", -1);
gtk_text_buffer_insert (buffer, &iter, "For example, you can have/n ", -1);
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter,
"a blue foreground /n", -1,
"blue_foreground", NULL);
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter,
"a red background /n /n", -1,
"red_background", NULL);
/*
参数的含义:"a red background /n /n", 要显示的文本。"red_background", 格式化文本的名字。
*/
}
void
on_button1_clicked (GtkButton *button,
gpointer user_data)
{
GtkWidget *textview1 = lookup_widget (GTK_WIDGET(button), "textview1");
GtkTextBuffer *buffer;
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(textview1));
create_tags (buffer);
insert_text (buffer);
}
TreeView构件
Treeview构件的使用,需要三个构件的支持.或者说,Treeview构件和其它三个构件结合在一起才能使用.
这三个构件连同treeview是:
GtkTreeModel
GtkCellRenderer
GtkTreeViewColumn
GtkTreeView
TreeView构件的使用是相当灵活的,它可以,以列表的形式显示数据,
也可以,以树形的形式使用显示数据.
还可以对显示出来的数据,进行各种灵活的操作.
好多功能,以后慢慢捉摸吧!
这一节,我们讲述它的最简单的功能:以列表的形式显示数据.
是这样设计的:单击按钮,在TreeView构件中以列表的形式显示数据。
一、用Glade设计界面。
依此放置window构件,垂直框构件(放置的时候设置为两行),
然后在垂直框的第一行,放置按钮构件。
在第二行,放置TreeView构件。
生成代码。
二、编写代码
callbacks.c
/*定义数据结构*/
typedef struct
{
const gchar *id;
const gchar *name;
const gchar *address;
}
telman;
enum
{
COLUMN_ID,
COLUMN_NAME,
COLUMN_ADDRESS,
NUM_COLUMNS
};
/*添加数据*/
static telman data[] =
{
{"001","cuigf","china"},{"002","home","shanxi"},{"003","",""},
};
/*设置TreeView构件的模式*/
static GtkTreeModel * create_model (void)
{
gint i = 0;
GtkListStore *store;
GtkTreeIter iter;
/* create list store */
store = gtk_list_store_new (NUM_COLUMNS,
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_STRING);
/* add data to the list store */
for (i = 0; i < G_N_ELEMENTS (data); i++)
{
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter,
COLUMN_ID, data[i].id,
COLUMN_NAME, data[i].name,
COLUMN_ADDRESS, data[i].address,
-1);
}
return GTK_TREE_MODEL (store);
}
/*往TreeView构件里添加列*/
static void add_columns (GtkTreeView *treeview)
{
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
renderer = gtk_cell_renderer_text_new ();
column = gtk_tree_view_column_new_with_attributes ("ID",
renderer,
"text",
COLUMN_ID,
NULL);
gtk_tree_view_append_column (treeview, column);
renderer = gtk_cell_renderer_text_new ();
column = gtk_tree_view_column_new_with_attributes ("NAME",
renderer,
"text",
COLUMN_NAME,
NULL);
gtk_tree_view_append_column (treeview, column);
renderer = gtk_cell_renderer_text_new ();
column = gtk_tree_view_column_new_with_attributes ("ADDRESS",
renderer,
"text",
COLUMN_ADDRESS,
NULL);
gtk_tree_view_append_column (treeview, column);
}
void
on_button1_clicked (GtkButton *button,
gpointer user_data)
{
GtkWidget *treeview1 = lookup_widget (GTK_WIDGET(button), "treeview1");
GtkTreeModel *model;
model = create_model ();
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview1),model);
g_object_unref (model);
add_columns (GTK_TREE_VIEW (treeview1));
}