白浪 发表于 2013-9-14 00:35:43

2.4检查按钮和选择按钮

检查按钮就是我们通常来说的复选框。检查按钮(checkbutton,GtkCheckButton)由触发按钮(GtkToggleButton)派生而来。GtkCheckButton的表现类似GtkToggleButton。两者的主要差别是按钮在屏幕上的显示方式不同。两种构件完成同样的功能,选择哪一种按钮纯粹是用户爱好。

所以所以我们将gtktogglebutton的例子改一下就可以成为gtkcheckbutton的例子了,如以下代码所示
<P> #include <gtk/gtk.h></P>
<P>void button_toggled(GtkWidget *widget,gpointer *data)
{
    //在终端中打印
    if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget))==TRUE)
    g_printf("button checked!!!\n");
    else
    g_printf("button unchecked!!!\n");
}</P>
<P>int main (void)
{
    GtkWidget *window = NULL;
    GtkWidget *button = NULL;
    // 初始化 GTK
    gtk_init(NULL, NULL);
    // 建立一個新的 GtkWindow
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    //建立一个新的button
    //button = gtk_button_new ();
    button = gtk_check_button_new_with_label ("check button");
    // 設置標題
    gtk_window_set_title (GTK_WINDOW (window), "Window");
    // 設置默認大小
    gtk_window_set_default_size (GTK_WINDOW (window), 300, 200);
    //将button放置到window容器中
    gtk_container_add(GTK_CONTAINER(window),button);
    // 處理 "destroy" 信號,當窗口被關閉時退出程序
    g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
    g_signal_connect (button, "toggled", G_CALLBACK (button_toggled), NULL);
    // 顯示窗口和所有子組件
    gtk_widget_show_all (window);
    // 開始事件循環
    gtk_main ();
    // gtk_main_quit 會導致 gtk_main 退出,於是程序結束
    return 0;
}
</P>显示效果如下图:


白浪 发表于 2013-9-14 00:36:03

本帖最后由 白浪 于 2013-9-14 01:17 编辑

选择按钮就是我们通常来说的单选框。从外观来看,选择按钮(GtkRaddioButton)很像检查按钮。因为选
择按钮是从检查按钮派生而来的。选择按钮和检查按钮的区别不大,对选择按钮来说,任何时候在一组按
钮只可以选择一个按钮,点击一个按钮就释放前面选择的按钮,使点击的按钮成为被选择的按钮。

可以用gtk_radio_hutton_new_with_label函数建立带标号的GtkRadioButton,或者用gtk_radio_button_new
函数建立不带标号的GtkRadioButton。建立GtkRadioButton只完成了工作的一半。因为选择按钮必须和组
联系起来,使得任何时候只能选择一个按钮。

以下代码是创建了3个选择按钮,并将3个选择按钮加入了同一个组中,使得3个选择按钮在任何时候只能选择一个按钮。
<P> #include <gtk/gtk.h></P>
<P> </P>
<P>int main (void)
{
    GtkWidget *window = NULL;
    GtkWidget *button1 = NULL;
    GtkWidget *button2 = NULL;
    GtkWidget *button3 = NULL;
    GtkWidget *fixed = NULL;
    GSList*group=NULL;
    // 初始化 GTK
    gtk_init(NULL, NULL);
    // 建立一個新的 GtkWindow
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    fixed=gtk_fixed_new();
    //建立一个新的button
    //button = gtk_button_new ();
    button1 = gtk_radio_button_new_with_label (group,"check button1");
    group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button1));
    button2 = gtk_radio_button_new_with_label (group,"check button2");
    group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button2));
    button3 = gtk_radio_button_new_with_label (group,"check button3");</P>
<P>    gtk_fixed_put(GTK_FIXED(fixed),button1,40,20);
    gtk_fixed_put(GTK_FIXED(fixed),button2,40,40);
    gtk_fixed_put(GTK_FIXED(fixed),button3,40,60);
    // 設置標題
    gtk_window_set_title (GTK_WINDOW (window), "Window");
    // 設置默認大小
    gtk_window_set_default_size (GTK_WINDOW (window), 300, 200);
    gtk_container_add(GTK_CONTAINER(window),fixed);
    // 處理 "destroy" 信號,當窗口被關閉時退出程序
    g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
//    g_signal_connect (button, "toggled", G_CALLBACK (button_toggled), NULL);
    // 顯示窗口和所有子組件
    gtk_widget_show_all (window);
    // 開始事件循環
    gtk_main ();
    // gtk_main_quit 會導致 gtk_main 退出,於是程序結束
    return 0;
}
</P>每添加一个选择按钮后都得调用一次gtk_radio_button_get_group函数取得组,然后继续添加按钮。如果不这样
做将导致不可预期的结果。



以下代码是加了回调之后的代码,就不解释了哈 有问题就提问哈#include <gtk/gtk.h>

void button_toggled(GtkWidget *widget,gpointer *data)
{
//在终端中打印
if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget))==TRUE)
{
if(data==1)g_printf("button1 checked!!!\n");
else if(data==2)g_printf("button2 checked!!!\n");
else if(data==3)g_printf("button3 checked!!!\n");

}
}

int main (void)
{
GtkWidget *window = NULL;
GtkWidget *button1 = NULL;
GtkWidget *button2 = NULL;
GtkWidget *button3 = NULL;
GtkWidget *fixed = NULL;
GSList *group=NULL;
// 初始化 GTK
gtk_init(NULL, NULL);
// 建立一個新的 GtkWindow
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
fixed=gtk_fixed_new();
//建立一个新的button
//button = gtk_button_new ();
button1 = gtk_radio_button_new_with_label (group,"check button1");
group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button1));
button2 = gtk_radio_button_new_with_label (group,"check button2");
group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button2));
button3 = gtk_radio_button_new_with_label (group,"check button3");

gtk_fixed_put(GTK_FIXED(fixed),button1,40,20);
gtk_fixed_put(GTK_FIXED(fixed),button2,40,40);
gtk_fixed_put(GTK_FIXED(fixed),button3,40,60);
// 設置標題
gtk_window_set_title (GTK_WINDOW (window), "Window");
// 設置默認大小
gtk_window_set_default_size (GTK_WINDOW (window), 300, 200);
gtk_container_add(GTK_CONTAINER(window),fixed);
// 處理 "destroy" 信號,當窗口被關閉時退出程序
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
g_signal_connect (button1, "toggled", G_CALLBACK (button_toggled), (gpointer)1);
g_signal_connect (button2, "toggled", G_CALLBACK (button_toggled), (gpointer)2);
g_signal_connect (button3, "toggled", G_CALLBACK (button_toggled), (gpointer)3);
// 顯示窗口和所有子組件
gtk_widget_show_all (window);
// 開始事件循環
gtk_main ();
// gtk_main_quit 會導致 gtk_main 退出,於是程序結束
return 0;
}

效果如下图:


作业:
将控制台打印的内容以label的形式显示在窗口上

白浪 发表于 2013-9-14 00:36:10

占位
页: [1]
查看完整版本: 2.4检查按钮和选择按钮