![]() |
![]() |
![]() |
LevelBarとSeparator
メーター表示がしたくなったので、LevelBarのサンプルを書いてみた。
|
#include <gtk/gtk.h> GtkWidget *levelbar; //タイムカウントのON/OFFに使う
static guint timer_id;//各buttonのEnableとDisableを制御する値
gint lbstate;//LevelBarが持つ値
gdouble lbvalue;//LevelBarの値を増やして表示
static gboolean ivent_loop(gpointer user_data){ lbvalue += 1.0; gtk_level_bar_set_value(GTK_LEVEL_BAR(levelbar), lbvalue); if( lbvalue >= 20.0 ){ lbstate = 2; g_source_remove(timer_id); } } //button1がEnable(lbstate = 0)であれば、0.5秒ごとにLevelBarを伸ばす
static void cb_button1_clicked(GtkWidget *widget, gpointer data){ if( lbstate == 0 ){ lbstate = 1; timer_id = g_timeout_add(500, (GSourceFunc)ivent_loop, NULL); } } //button2がEnable(lbstate = 2)であれば、LebelBarをリセットする
static void cb_button2_clicked(GtkWidget *widget, gpointer data){ if( lbstate == 2 ){ lbstate = 0; lbvalue = 0.0; gtk_level_bar_set_value(GTK_LEVEL_BAR(levelbar), lbvalue); } } static void cb_button3_clicked(GtkWidget *button2, gpointer user_data) { gtk_main_quit(); } int main(int argc, char** argv) { lbvalue = 0.0; lbstate = 0; GtkWidget *window; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *button1; GtkWidget *button2; GtkWidget *button3; GtkWidget *vseparator; GtkWidget *hseparator; gtk_init(&argc,&argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_size_request(window, 300, 200); gtk_window_set_title(GTK_WINDOW(window), "LevelBar"); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(window), 10); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_add(GTK_CONTAINER(window), vbox); levelbar = gtk_level_bar_new(); //LebelBarの最小値を0に設定
gtk_level_bar_set_min_value(GTK_LEVEL_BAR(levelbar), 0.0); //LebelBarの最大値を20に設定
gtk_level_bar_set_max_value(GTK_LEVEL_BAR(levelbar), 20.0); //LebelBarに初期値(0)を設定
gtk_level_bar_set_value(GTK_LEVEL_BAR(levelbar), lbvalue);gtk_box_pack_start(GTK_BOX(vbox), levelbar, TRUE, TRUE, 0); //HorizontalSeparatorを配置
hseparator = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);gtk_box_pack_start(GTK_BOX(vbox), hseparator, TRUE, TRUE, 0); hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); button1 = gtk_button_new_with_label("Start"); g_signal_connect(G_OBJECT(button1), "clicked", G_CALLBACK(cb_button1_clicked), NULL); gtk_box_pack_start(GTK_BOX(hbox), button1, TRUE, TRUE, 0); //VerticalSeparatorを配置
vseparator = gtk_separator_new(GTK_ORIENTATION_VERTICAL);gtk_box_pack_start(GTK_BOX(hbox), vseparator, TRUE, TRUE, 0); button2 = gtk_button_new_with_label("Reset"); g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(cb_button2_clicked), NULL); gtk_box_pack_start(GTK_BOX(hbox), button2, TRUE, TRUE, 0); hseparator = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL); gtk_box_pack_start(GTK_BOX(vbox), hseparator, TRUE, TRUE, 0); button3 = gtk_button_new_with_label("Quit"); gtk_box_pack_start(GTK_BOX(vbox), button3, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(button3), "clicked", G_CALLBACK(cb_button3_clicked), NULL); gtk_widget_show_all(window); gtk_main(); return 0; } |
「Start」ボタンでタイムカウントを始め、LevelBarを伸ばして行く。
LevelBarの値がMaxになると「Reset」ボタンが使えるようになる。
「Reset」ボタンをクリックすると、LevelBarがリセットされ、再び「Start」ボタンが使えるようになる。
今回はLevelBarの他に、Separatorとタイムカウントの終了を使ってみた。 気まぐれで作成できそうなウィジェットは、これで紹介し尽したので、 次回はGTK+の可能性を広げるべく、再び信号を学び直そうと思う。