天天看點

GTK+重拾--04 菜單欄使用

版權聲明:您好,轉載請留下本人部落格的位址,謝謝 https://blog.csdn.net/hongbochen1223/article/details/50235519

(一):寫在前面

在這一小節中,我主要是回顧了GTK+2.0的菜單欄和狀态欄的使用。菜單欄(menubar)是GUI程式中最常見的部分之一。我們在日常使用視窗程式的時候,很多我們需要的功能都是在菜單欄和工具欄中擷取的。首先我們先來了解一下什麼是菜單欄和工具欄。

菜單欄就是我們點選視窗的最上面的按鈕的時候彈出的彈出框,其中有好多菜單去提供功能。下面我們看一下我的菜單的截圖:

其中最上面盛放File,Edit,View…等内容的就是菜單欄,而File就是菜單,點選File彈出的彈出框中的Open…,Open a Copy…等内容就是菜單條目,每一個菜單條目對應不同的每一個功能。

而工具欄就是每一個工具選項提供一個功能,使用者點選相應的工具選項去提供相應的功能。

其中紅色部分框起來的就是我們需要的工具欄。

(二):菜單欄

1:菜單欄簡單示例

下面我們來實作一個簡單的含有檔案菜單的菜單欄,檔案菜單隻有一個菜單條,如果點選這個菜單條程式将退出。

#include <gtk/gtk.h>

int main(int argc,char *argv[])
{
    GtkWidget *window;
    GtkWidget *vbox;   //布局方式

    GtkWidget *menubar;   //菜單欄
    GtkWidget *filemenu;  //菜單
    GtkWidget *file;      //容器
    GtkWidget *quit;      //退出菜單條

    gtk_init(&argc,&argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window),250,200);
    gtk_window_set_title(GTK_WINDOW(window),"menu");

    vbox = gtk_vbox_new(FALSE,0);
    gtk_container_add(GTK_CONTAINER(window),vbox);

    menubar = gtk_menu_bar_new();
    filemenu = gtk_menu_new();

    file = gtk_menu_item_new_with_label("File");
    quit = gtk_menu_item_new_with_label("Quit");

    gtk_menu_item_set_submenu(GTK_MENU_ITEM(file),filemenu);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu),quit);
    gtk_menu_shell_append(GTK_MENU_SHELL(menubar),file);

    gtk_box_pack_start(GTK_BOX(vbox),menubar,FALSE,FALSE,3);

    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
    g_signal_connect(G_OBJECT(quit),"activate",G_CALLBACK(gtk_main_quit),NULL);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}

           

菜單欄和菜單都是源屬于同一個構件,就是menu shell。菜單選項(menu items)是一個隻對菜單有效的子構件。

下面我們來看一下GTK+2.0的菜單欄組成部分:

2:圖像菜單:mnemonics和accelators

有的時候,我們會看到,我們使用菜單欄的時候會看到可以使用快捷鍵或者是有的菜單項有圖像标示,下面我們就要實作帶有快捷鍵的菜單項:

#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>

int main(int argc,char *argv[])
{
    GtkWidget *window;
    GtkWidget *vbox;

    GtkWidget *menubar;
    GtkWidget *filemenu;
    GtkWidget *file;
    GtkWidget *f_new;
    GtkWidget *open;
    GtkWidget *quit;

    GtkWidget *sep;
    GtkAccelGroup *accel_group = NULL;

    gtk_init(&argc,&argv);


    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window),250,200);
    gtk_window_set_title(GTK_WINDOW(window),"menu");

    vbox = gtk_vbox_new(FALSE,0);
    gtk_container_add(GTK_CONTAINER(window),vbox);

    menubar = gtk_menu_bar_new();
    filemenu = gtk_menu_new();

    accel_group = gtk_accel_group_new();
    gtk_window_add_accel_group(GTK_WINDOW(window),accel_group);

    file = gtk_menu_item_new_with_mnemonic("_File");
    f_new = gtk_image_menu_item_new_from_stock(GTK_STOCK_NEW,NULL);
    open = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN,NULL);

    sep = gtk_separator_menu_item_new();
    quit = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT,accel_group);

    gtk_widget_add_accelerator(quit,"activate",accel_group,GDK_q,GDK_CONTROL_MASK,GTK_ACCEL_VISIBLE);

    gtk_menu_item_set_submenu(GTK_MENU_ITEM(file),filemenu);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu),f_new);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu),open);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu),sep);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu),quit);
    gtk_menu_shell_append(GTK_MENU_SHELL(menubar),file);

    gtk_box_pack_start(GTK_BOX(vbox),menubar,FALSE,FALSE,3);

    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

    g_signal_connect(G_OBJECT(quit),"activate",G_CALLBACK(gtk_main_quit),NULL);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}
           

不知道為什麼我的GTK+2.0不顯示菜單欄圖像。

下面這張圖檔是我在我看的書上扒下來的:

3:選擇菜單選項

在GTK+2.0中,GtkCheckMenuItem是一個可以生成帶有選擇的菜單選項。

#include <gtk/gtk.h>

void toggle_statusbar(GtkWidget *widget,gpointer statusbar)
{
    if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))){
        gtk_widget_show(statusbar);
    }else{
        gtk_widget_hide(statusbar);
    }
}

int main(int argc,char *argv[])
{
    GtkWidget *window;
    GtkWidget *vbox;

    GtkWidget *menubar;
    GtkWidget *viewmenu;
    GtkWidget *view;
    GtkWidget *tog_stat;
    GtkWidget *statusbar;

    gtk_init(&argc,&argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window),250,200);
    gtk_window_set_title(GTK_WINDOW(window),"view statusbar");

    vbox = gtk_vbox_new(FALSE,0);
    gtk_container_add(GTK_CONTAINER(window),vbox);

    menubar = gtk_menu_bar_new();
    viewmenu = gtk_menu_new();

    view = gtk_menu_item_new_with_label("View");
    tog_stat = gtk_check_menu_item_new_with_label("View Statusbar");
    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(tog_stat),TRUE);

    gtk_menu_item_set_submenu(GTK_MENU_ITEM(view),viewmenu);
    gtk_menu_shell_append(GTK_MENU_SHELL(viewmenu),tog_stat);
    gtk_menu_shell_append(GTK_MENU_SHELL(menubar),view);

    gtk_box_pack_start(GTK_BOX(vbox),menubar,FALSE,FALSE,3);

    statusbar = gtk_statusbar_new();
    gtk_box_pack_end(GTK_BOX(vbox),statusbar,FALSE,TRUE,1);

    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

    g_signal_connect(G_OBJECT(tog_stat),"activate",G_CALLBACK(toggle_statusbar),statusbar);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}

           

這裡我們制造一個帶有選擇框的菜單選項。具體的功能為:如果選擇框被選中則“狀态欄”就會顯示出來,反之則不會顯示。

函數gtk_check_menu_item_new_with_label()就會生成一個新的帶有選擇框的菜單選項。

(三):寫在後面

在這裡我們學習了如何使用菜單欄,後面我們将會學習使用工具欄。