The Widgets

几种小部件综合练习一下./**
* Box 布局
*/
#include <gtk/gtk.h>
#include <string.h>
/* Signal Functions ---------------------------------------------
----------------------------------------------------------------- */
// 关闭程序
void CloseTheApp ( GtkWidget * widget, gpointer data ) {
gtk_main_quit ();
}
// 点击普通按钮
void ButtonClicked ( GtkButton * button, gpointer data ) {
g_print ( "标签里面的内容是: " );
g_print ( gtk_label_get_text ( GTK_LABEL ( data ) ) );
g_print ( "\n" );
}
// 文本域内容改变
void EntryChanged ( GtkEntry * entry, gpointer data ) {
gchar * entry_text;
entry_text = ( gchar * )gtk_entry_get_text ( entry );
gtk_label_set_text ( GTK_LABEL ( data ), entry_text );
}
// 点击开关按钮, 开关按钮状态变化
void ToggleButtonClicked ( GtkButton * button, gpointer data ) {
gboolean visibility = TRUE; // 是否可见
// 开关按钮被按下去
if ( gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( button ) ) ) {
visibility = FALSE;
gtk_button_set_label ( GTK_BUTTON ( button ), "公开文本域内容" );
// 如果开关没按下去
} else {
visibility = TRUE;
gtk_button_set_label ( GTK_BUTTON ( button ), "保密文本域内容" );
}
// 改变文本域状态
gtk_entry_set_visibility ( GTK_ENTRY ( data ), visibility );
}
// 单选按钮状态变换
void RadioButtonToggled ( GtkRadioButton * button, gpointer data ) {
gchar * str = NULL;
str = ( gchar * ) gtk_button_get_label ( GTK_BUTTON ( button ) );
// 如果按钮被激活
if ( gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( button ) ) ) {
// 被激活的是 Enable
if ( strcmp ( str, "Enable" ) == 0 ) {
gtk_entry_set_editable ( GTK_ENTRY ( data ), TRUE ); // 文本域内容可以更改
// 被激活的是 Disable
} else {
gtk_entry_set_editable ( GTK_ENTRY ( data ), FALSE ); // 文本域内容不能更改
}
}
}
// 复选按钮状态变换
void CheckButtonToggled ( GtkCheckButton * button, gpointer data ) {
// 如果按钮被激活
if ( gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( button ) ) ) {
gtk_widget_hide ( GTK_WIDGET ( data ) ); // 隐藏一个指定的小部件
} else {
gtk_widget_show ( GTK_WIDGET ( data ) ); // 显示一个指定的小部件
}
}
/* GUI Functions ---------------------------------------------
----------------------------------------------------------------- */
// 创建一个窗口
GtkWidget * MakeWindow () {
GtkWidget * window;
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL );
gtk_container_set_border_width ( GTK_CONTAINER ( window ), 10 );
gtk_window_set_title ( GTK_WINDOW ( window ), "The Widgets" );
gtk_window_set_position ( GTK_WINDOW ( window ), GTK_WIN_POS_CENTER ); // 显示在屏幕中间
gtk_signal_connect ( GTK_OBJECT ( window ),
"destroy",
GTK_SIGNAL_FUNC ( CloseTheApp ),
NULL );
return window;
}
// 水平添加两个小部件到一个 Box, 并返回
GtkWidget * HPanel ( GtkWidget * widget0, GtkWidget * widget1 ) {
GtkWidget * box;
box = gtk_hbox_new ( TRUE, 10 );
gtk_box_pack_start ( GTK_BOX ( box ), widget0, FALSE, TRUE, 0 );
gtk_box_pack_start ( GTK_BOX ( box ), widget1, FALSE, TRUE, 0 );
return box;
}
// 添加一个单选按钮到一个组和 Box 中去
GSList * AddRedioButton ( GtkWidget * box, gchar * label, GSList * group, GtkWidget * entry ) {
GtkWidget * radiobutton;
// 初始化单选按钮, 并将它加到组里面去
radiobutton = gtk_radio_button_new_with_label ( group, label );
group = gtk_radio_button_group ( GTK_RADIO_BUTTON ( radiobutton ) );
//将单选按钮添加到 Box 里面去
gtk_box_pack_start ( GTK_BOX ( box ), radiobutton, FALSE, TRUE, 0 );
gtk_signal_connect ( GTK_OBJECT ( radiobutton ),
"toggled",
GTK_SIGNAL_FUNC ( RadioButtonToggled ),
entry );
return group;
}
// 添加一个复选按钮到 Box 中去
void AddCheckButton ( GtkWidget * box, gchar * label, GtkWidget * widget ) {
GtkWidget * checkbutton;
// 初始化复选按钮
checkbutton = gtk_check_button_new_with_label ( label );
//将复选按钮添加到 Box 里面去
gtk_box_pack_start ( GTK_BOX ( box ), checkbutton, FALSE, TRUE, 0 );
gtk_signal_connect ( GTK_OBJECT ( checkbutton ),
"toggled",
GTK_SIGNAL_FUNC ( CheckButtonToggled ),
widget );
}
/* Main Functions ---------------------------------------------
----------------------------------------------------------------- */
gint main ( gint argc, gchar * argv[] ) {
GtkWidget * window;
GtkWidget * mainbox;
GSList * group = NULL;
GtkWidget * frame_left;
GtkWidget * box_left;
GtkWidget * frame_right;
GtkWidget * box_right;
GtkWidget * entry;
GtkWidget * label;
GtkWidget * togglebutton;
GtkWidget * button;
gtk_init ( &argc, &argv );
window = MakeWindow ();
// 标签
label = gtk_label_new ( NULL );
gtk_label_set_width_chars ( GTK_LABEL ( label ), 16 );
gtk_label_get_single_line_mode ( GTK_LABEL ( label ) );
// 文本域
entry = gtk_entry_new ();
gtk_entry_set_width_chars ( GTK_ENTRY ( entry ), 16 );
gtk_signal_connect ( GTK_OBJECT ( entry ),
"changed",
GTK_SIGNAL_FUNC ( EntryChanged ),
label );
// 开关按钮
togglebutton = gtk_toggle_button_new_with_label ( "保密文本域内容" );
gtk_signal_connect ( GTK_OBJECT ( togglebutton ),
"clicked",
GTK_SIGNAL_FUNC ( ToggleButtonClicked ),
entry );
// 按钮
button = gtk_button_new_with_label ( "显示标签内容" );
gtk_signal_connect ( GTK_OBJECT ( button ),
"clicked",
GTK_SIGNAL_FUNC ( ButtonClicked ),
label );
// 单选按钮
frame_left = gtk_frame_new ( "文本域状态" );
box_left = gtk_vbox_new ( TRUE, 0 );
group = AddRedioButton ( box_left, "Enable", group, entry );
group = AddRedioButton ( box_left, "Disable", group, entry );
gtk_container_add ( GTK_CONTAINER ( frame_left ), box_left );
// 复选按钮
frame_right = gtk_frame_new ( "隐藏小部件" );
box_right = gtk_vbox_new ( TRUE, 0 );
AddCheckButton ( box_right, "文本域", entry );
AddCheckButton ( box_right, "标签", label );
gtk_container_add ( GTK_CONTAINER ( frame_right ), box_right );
// 主面板
mainbox = gtk_vbox_new ( FALSE, 10 ); // 初始化主面板为垂直分布, 紧凑分配空间, 间隙为 10
gtk_box_pack_start ( GTK_BOX ( mainbox ), HPanel ( frame_left, frame_right ), FALSE, FALSE, 0 );
gtk_box_pack_start ( GTK_BOX ( mainbox ), HPanel ( entry, label ), FALSE, FALSE, 0 );
gtk_box_pack_start ( GTK_BOX ( mainbox ), HPanel ( togglebutton, button ), FALSE, FALSE, 0 );
gtk_container_add ( GTK_CONTAINER ( window ), mainbox ); // 将主面板添加到窗口上
gtk_widget_show_all ( window );
gtk_main ();
return 0;
}
1 条评论:
It is a pity, that now I can not express - I am late for a meeting. But I will be released - I will necessarily write that I think on this question.
发表评论