<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # GTK+ 中的菜單和工具欄 > 原文: [http://zetcode.com/gui/gtk2/menusandtoolbars/](http://zetcode.com/gui/gtk2/menusandtoolbars/) 在 GTK+ 編程教程的這一部分中,我們使用菜單和工具欄。菜單欄是 GUI 應用的常見部分。 它是位于各個菜單中的一組命令。 `GtkMenuBar`是創建菜單欄的窗口小部件。 它包含一對多`GtkMenuItems`。 菜單項是用戶可以選擇的對象。 `GtkMenu`實現了一個由`GtkMenuItem`對象列表組成的下拉菜單,用戶可以對其進行導航和激活以執行應用功能。 `GtkMenu`附加到菜單欄的菜單項或另一個菜單的菜單項。 ![Menus](https://img.kancloud.cn/68/6a/686aa8d9e3083fccc0078137a2d7f2cf_515x461.jpg) 圖:菜單 該圖顯示了菜單欄及其菜單的結構。 ## 簡單菜單示例 在第一個示例中,我們創建帶有一個“文件”菜單的菜單欄。 `simplemenu.c` ```c #include <gtk/gtk.h> int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *vbox; GtkWidget *menubar; GtkWidget *fileMenu; GtkWidget *fileMi; GtkWidget *quitMi; 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), 300, 200); gtk_window_set_title(GTK_WINDOW(window), "Simple menu"); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); menubar = gtk_menu_bar_new(); fileMenu = gtk_menu_new(); fileMi = gtk_menu_item_new_with_label("File"); quitMi = gtk_menu_item_new_with_label("Quit"); gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), quitMi); gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMi); gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(quitMi), "activate", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); gtk_main(); return 0; } ``` 示例中的菜單具有一個菜單項。 通過選擇項目,應用退出。 ```c menubar = gtk_menu_bar_new(); ``` `gtk_menu_bar_new()`創建一個新的`GtkMenuBar`。 ```c filemenu = gtk_menu_new(); ``` `gtk_menu_new()`函數創建一個新的`GtkMenu`。 ```c gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu); ``` 通過`gtk_menu_item_set_submenu()`函數將`fileMenu`設置為文件菜單項。 菜單是容納菜單項的容器。 它們本身已插入特定的菜單項。 ```c gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), quitMi); ``` 通過`gtk_menu_shell_append()`函數將`quitMi`添加到文件菜單。 ```c gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMi); ``` 使用`gtk_menu_shell_append()`函數將文件菜單項添加到菜單欄。 `GtkMenu`和`GtkMenuBar`均來自`GtkMenuShell`。 ```c g_signal_connect(G_OBJECT(quitMi), "activate", G_CALLBACK(gtk_main_quit), NULL); ``` 通過選擇退出菜單項,我們終止了該應用。 ![Simple menu](https://img.kancloud.cn/a2/d6/a2d66795141813a1ccef37d0a803b185_302x226.jpg) 圖:簡單菜單 ## 子菜單 下一個示例演示如何創建子菜單。 子菜單是另一個菜單中的菜單。 `submenu.c` ```c #include <gtk/gtk.h> int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *vbox; GtkWidget *menubar; GtkWidget *fileMenu; GtkWidget *imprMenu; GtkWidget *sep; GtkWidget *fileMi; GtkWidget *imprMi; GtkWidget *feedMi; GtkWidget *bookMi; GtkWidget *mailMi; GtkWidget *quitMi; 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), 300, 200); gtk_window_set_title(GTK_WINDOW(window), "Submenu"); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); menubar = gtk_menu_bar_new(); fileMenu = gtk_menu_new(); fileMi = gtk_menu_item_new_with_label("File"); imprMenu = gtk_menu_new(); imprMi = gtk_menu_item_new_with_label("Import"); feedMi = gtk_menu_item_new_with_label("Import news feed..."); bookMi = gtk_menu_item_new_with_label("Import bookmarks..."); mailMi = gtk_menu_item_new_with_label("Import mail..."); gtk_menu_item_set_submenu(GTK_MENU_ITEM(imprMi), imprMenu); gtk_menu_shell_append(GTK_MENU_SHELL(imprMenu), feedMi); gtk_menu_shell_append(GTK_MENU_SHELL(imprMenu), bookMi); gtk_menu_shell_append(GTK_MENU_SHELL(imprMenu), mailMi); sep = gtk_separator_menu_item_new(); quitMi = gtk_menu_item_new_with_label("Quit"); gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), imprMi); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), sep); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), quitMi); gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMi); gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(quitMi), "activate", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); gtk_main(); return 0; } ``` 該示例在另一個菜單內創建一個菜單。 子菜單具有三個菜單項。 我們還添加了一個水平分隔符。 ```c imprMenu = gtk_menu_new(); imprMi = gtk_menu_item_new_with_label("Import"); feedMi = gtk_menu_item_new_with_label("Import news feed..."); bookMi = gtk_menu_item_new_with_label("Import bookmarks..."); mailMi = gtk_menu_item_new_with_label("Import mail..."); ``` 這是帶有菜單項的子菜單。 ```c gtk_menu_item_set_submenu(GTK_MENU_ITEM(imprMi), imprMenu); ``` `imprMenu`子菜單被添加到其自己的菜單項中。 ```c gtk_menu_shell_append(GTK_MENU_SHELL(imprMenu), feedMi); gtk_menu_shell_append(GTK_MENU_SHELL(imprMenu), bookMi); gtk_menu_shell_append(GTK_MENU_SHELL(imprMenu), mailMi); ``` 使用`gtk_menu_shell_append()`函數將三個菜單項添加到子菜單。 ```c sep = gtk_separator_menu_item_new(); ``` 使用`gtk_separator_menu_item_new()`函數創建水平菜單分隔符。 ```c gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), imprMi); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), sep); ``` `imprMi`和分隔符通過`gtk_menu_shell_append()`函數添加到文件菜單。 ![Submenu](https://img.kancloud.cn/04/c7/04c75b9b8dd56fbdffe495eee377ccfe_302x226.jpg) 圖:子菜單 ## 圖像菜單,助記符和加速器 `GtkImageMenuItem`是一個菜單項,在文本標簽旁邊帶有一個圖標。 由于用戶可以禁用菜單圖標的顯示,因此我們仍然需要填寫文本標簽。加速器是用于激活菜單項的鍵盤快捷鍵。助記符是 GUI 元素的鍵盤快捷鍵。 它們以帶下劃線的字符表示。 請注意,在某些環境中,我們首先需要按無鼠標修飾符(通常為`Alt`)以顯示帶下劃線的字符。 我們可能還配置了不顯示菜單圖像的環境。 要打開菜單圖像,我們啟動`gconf-editor`并轉到`/desktop/gnome/interface/menus_have_icons`并檢查選項。 `imagemenu.c` ```c #include <gtk/gtk.h> #include <gdk/gdkkeysyms.h> int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *vbox; GtkWidget *menubar; GtkWidget *fileMenu; GtkWidget *fileMi; GtkWidget *newMi; GtkWidget *openMi; GtkWidget *quitMi; 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), 300, 200); gtk_window_set_title(GTK_WINDOW(window), "Images"); 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); fileMi = gtk_menu_item_new_with_mnemonic("_File"); newMi = gtk_image_menu_item_new_from_stock(GTK_STOCK_NEW, NULL); openMi = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, NULL); sep = gtk_separator_menu_item_new(); quitMi = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, accel_group); gtk_widget_add_accelerator(quitMi, "activate", accel_group, GDK_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), newMi); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), openMi); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), sep); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), quitMi); gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMi); gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(quitMi), "activate", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); gtk_main(); return 0; } ``` 該示例包含三個帶有圖標的菜單項。 菜單項可以用助記符選擇。 退出菜單項具有鍵盤加速器。 ```c accel_group = gtk_accel_group_new(); gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); ... quitMi = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, accel_group); gtk_widget_add_accelerator(quitMi, "activate", accel_group, GDK_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); ``` 加速器組是一組鍵盤加速器,通常附加到頂層窗口。 在這里,我們創建 `Ctrl + Q` 鍵盤加速器。 ```c fileMi = gtk_menu_item_new_with_mnemonic("_File"); ``` `gtk_menu_item_new_with_mnemonic()`創建一個可以帶有助記符的菜單項。 標簽中的下劃線表示菜單項的助記符。 該字符與無鼠標修飾符(通常為`Alt`)結合在一起。 在我們的情況下,我們創建了 `Alt + F` 助記符。 ```c newMi = gtk_image_menu_item_new_from_stock(GTK_STOCK_NEW, NULL); openMi = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, NULL); ``` `gtk_image_menu_item_new_from_stock()`創建一個`GtkImageMenuItem`,其中包含來自庫存項目的圖像和文本。 ![Menu items with icons](https://img.kancloud.cn/b0/0a/b00ad2532d8aff68aad4e85fd9e46d0e_302x226.jpg) 圖:帶圖標的菜單項 ## `CheckMenuItem` `GtkCheckMenuItem`是帶有復選框的菜單項。 `checkmenuitem.c` ```c #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), 300, 200); gtk_window_set_title(GTK_WINDOW(window), "GtkCheckMenuItem"); 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, 0); statusbar = gtk_statusbar_new(); gtk_box_pack_end(GTK_BOX(vbox), statusbar, FALSE, TRUE, 0); g_signal_connect(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; } ``` 該示例在“查看”菜單中包含一個`GtkCheckMenuItem`。 如果該復選框已激活,則顯示狀態欄小部件。 ```c tog_stat = gtk_check_menu_item_new_with_label("View statusbar"); ``` `gtk_check_menu_item_new_with_label()`函數創建一個新的`CheckMenuItem`。 ```c statusbar = gtk_statusbar_new(); ``` `gtk_statusbar_new()`函數創建一個新的`GtkStatusbar`小部件。 它用于向用戶報告次要消息。 ```c if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) { gtk_widget_show(statusbar); } else { gtk_widget_hide(statusbar); } ``` 如果菜單項中的復選框被激活,我們將顯示狀態欄小部件。 否則狀態欄將被隱藏。 ![GtkCheckMenuItem](https://img.kancloud.cn/d7/33/d733f28b1a94e427a7a2ea56fd0549d0_302x226.jpg) 圖:`GtkCheckMenuItem` ## 彈出菜單 在下一個示例中,我們創建一個彈出菜單。 彈出菜單也稱為上下文菜單。 當我們右鍵單擊 GUI 對象時,通常會顯示這種類型的菜單。 `popupmenu.c` ```c #include <gtk/gtk.h> int show_popup(GtkWidget *widget, GdkEvent *event) { const gint RIGHT_CLICK = 3; if (event->type == GDK_BUTTON_PRESS) { GdkEventButton *bevent = (GdkEventButton *) event; if (bevent->button == RIGHT_CLICK) { gtk_menu_popup(GTK_MENU(widget), NULL, NULL, NULL, NULL, bevent->button, bevent->time); } return TRUE; } return FALSE; } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *ebox; GtkWidget *pmenu; GtkWidget *hideMi; GtkWidget *quitMi; 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), 300, 200); gtk_window_set_title(GTK_WINDOW(window), "Popup menu"); ebox = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(window), ebox); pmenu = gtk_menu_new(); hideMi = gtk_menu_item_new_with_label("Minimize"); gtk_widget_show(hideMi); gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), hideMi); quitMi = gtk_menu_item_new_with_label("Quit"); gtk_widget_show(quitMi); gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), quitMi); g_signal_connect_swapped(G_OBJECT(hideMi), "activate", G_CALLBACK(gtk_window_iconify), GTK_WINDOW(window)); g_signal_connect(G_OBJECT(quitMi), "activate", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect_swapped(G_OBJECT(ebox), "button-press-event", G_CALLBACK(show_popup), pmenu); gtk_widget_show_all(window); gtk_main(); return 0; } ``` 在代碼示例中,我們創建帶有兩個菜單項的彈出菜單。 第一個最小化窗口,第二個終止應用。 ```c ebox = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(window), ebox); ``` 為了處理按鈕按下事件,我們創建了一個`GtkEventBox`。 ```c pmenu = gtk_menu_new(); ``` 彈出菜單是`GtkMenu`。 ```c hideMi = gtk_menu_item_new_with_label("Minimize"); gtk_widget_show(hideMi); gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), hideMi); ``` 第一個菜單項已添加到彈出菜單。 ```c g_signal_connect_swapped(G_OBJECT(hideMi), "activate", G_CALLBACK(gtk_window_iconify), GTK_WINDOW(window)); ``` 選擇第一個菜單項將使窗口最小化。 我們將“隱藏”菜單項的`activate`信號連接到`gtk_window_iconify()`函數。 術語“圖標化”是“最小化”的同義詞。 ```c g_signal_connect_swapped(G_OBJECT(ebox), "button_press_event", G_CALLBACK(show_popup), pmenu); ``` 當按下鼠標按鈕時,會發出`button-press-event`信號。 我們將信號連接到`show_popup()`函數,然后將其傳遞給彈出菜單。 ```c if (event->type == GDK_BUTTON_PRESS) { ``` 在事件處理器內部,我們檢查按鈕按下事件的類型。 ```c if (bevent->button == RIGHT_CLICK) { gtk_menu_popup(GTK_MENU(widget), NULL, NULL, NULL, NULL, bevent->button, bevent->time); } ``` 當觸發信號的按鈕是鼠標右鍵時,我們將顯示帶有`gtk_menu_popup()`函數的彈出菜單。 ![Popup menu](https://img.kancloud.cn/e9/c5/e9c5b2b3c6efe26335cbd3c9a36e6365_302x226.jpg) 圖:彈出菜單 ## 工具欄 菜單將我們可以在應用中使用的命令分組。 使用工具欄可以快速訪問最常用的命令。 `GtkToolbar`是 GTK+ 中的工具欄小部件。 工具欄可以包含`GtkToolItem`子類的實例,例如 `GtkToolButton`或`GtkSeparatorToolItem`。 `toolbar.c` ```c #include <gtk/gtk.h> int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *vbox; GtkWidget *toolbar; GtkToolItem *newTb; GtkToolItem *openTb; GtkToolItem *saveTb; GtkToolItem *sep; GtkToolItem *exitTb; 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), 300, 200); gtk_window_set_title(GTK_WINDOW(window), "toolbar"); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); toolbar = gtk_toolbar_new(); gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS); newTb = gtk_tool_button_new_from_stock(GTK_STOCK_NEW); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), newTb, -1); openTb = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), openTb, -1); saveTb = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), saveTb, -1); sep = gtk_separator_tool_item_new(); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), sep, -1); exitTb = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), exitTb, -1); gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 5); g_signal_connect(G_OBJECT(exitTb), "clicked", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); gtk_main(); return 0; } ``` 該代碼示例創建了簡單的工具欄示例。 ```c toolbar = gtk_toolbar_new(); ``` `gtk_toolbar_new()`函數創建一個新的`GtkToolBar`小部件。 ```c gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS) ``` `gtk_toolbar_set_style()`函數將工具欄的視圖更改為僅顯示圖標,僅顯示文本或同時顯示兩者。 傳遞`GTK_TOOLBAR_ICONS`常量可使工具欄僅顯示圖標。 ```c newTb = gtk_tool_button_new_from_stock(GTK_STOCK_NEW); ``` `gtk_tool_button_new_from_stock()`函數創建一個新的`GtkToolButton`,其中包含來自庫存項目的圖像和文本。 ```c gtk_toolbar_insert(GTK_TOOLBAR(toolbar), new, -1); ``` `gtk_toolbar_insert()`函數將`GtkToolItem`插入工具欄的指定位置。 如果位置為負,則該項目將附加到工具欄的末尾。 ```c sep = gtk_separator_tool_item_new(); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), sep, -1); ``` `gtk_separator_tool_item_new()`函數創建一個新的`GtkSeparatorToolItem`。 它通過`gtk_toolbar_insert()`函數插入到工具欄中。 ![Toolbar](https://img.kancloud.cn/e1/29/e129f7adc597b64fe7450790ac588cee_302x226.jpg) 圖:工具欄 ## 撤銷重做 下面的示例演示如何禁用工具欄上的工具欄按鈕。 這是 GUI 編程中的常見做法。 例如,保存按鈕; 如果我們將文檔的所有更改都保存到磁盤上,則在大多數文本編輯器中,“保存”按鈕均處于禁用狀態。 這樣,應用會向用戶指示所有更改都已保存。 `undoredo.c` ```c #include <gtk/gtk.h> void undo_redo(GtkWidget *widget, gpointer item) { static gint count = 2; const gchar *name = gtk_widget_get_name(widget); if (g_strcmp0(name, "undo") ) { count++; } else { count--; } if (count < 0) { gtk_widget_set_sensitive(widget, FALSE); gtk_widget_set_sensitive(item, TRUE); } if (count > 5) { gtk_widget_set_sensitive(widget, FALSE); gtk_widget_set_sensitive(item, TRUE); } } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *vbox; GtkWidget *toolbar; GtkToolItem *undo; GtkToolItem *redo; GtkToolItem *sep; GtkToolItem *exit; 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), 300, 200); gtk_window_set_title(GTK_WINDOW(window), "Undo redo"); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); toolbar = gtk_toolbar_new(); gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS); gtk_container_set_border_width(GTK_CONTAINER(toolbar), 2); undo = gtk_tool_button_new_from_stock(GTK_STOCK_UNDO); gtk_widget_set_name(GTK_WIDGET(undo), "undo"); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), undo, -1); redo = gtk_tool_button_new_from_stock(GTK_STOCK_REDO); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), redo, -1); sep = gtk_separator_tool_item_new(); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), sep, -1); exit = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), exit, -1); gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(undo), "clicked", G_CALLBACK(undo_redo), redo); g_signal_connect(G_OBJECT(redo), "clicked", G_CALLBACK(undo_redo), undo); g_signal_connect(G_OBJECT(exit), "clicked", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); gtk_main(); return 0; } ``` 我們的示例從 GTK+ 庫存資源創建撤消和重做按鈕。 單擊幾下后,每個按鈕均被禁用。 按鈕顯示為灰色。 ```c if (count < 0) { gtk_widget_set_sensitive(widget, FALSE); gtk_widget_set_sensitive(item, TRUE); } if (count > 5) { gtk_widget_set_sensitive(widget, FALSE); gtk_widget_set_sensitive(item, TRUE); } ``` `gtk_widget_set_sensitive()`函數用于激活或禁用工具欄按鈕。 ![Undo redo](https://img.kancloud.cn/92/52/9252a205793d91a135da2d27654262ef_302x226.jpg) 圖:撤銷和重做 在本章中,我們介紹了 GTK+ 中的菜單和工具欄。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看