<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ### 菜單控件 創建菜單欄和子菜單時要用到三種構件: ? 一個菜單項(menu item),就是用戶要選擇的東西,比如,"Save" ? 一個菜單(menu),作為菜單項的容器。 ? 一個菜單欄(menubar),是各個單獨菜單的容器。 ### 下面是創建菜單控件的一般步驟: ### ? 用 gtk_menu_new() 創建一個新的菜單 ? 多次調用 gtk_menu_item_new() 創建每個你想在你的菜單上出現的菜單項。并使用 gtk_menu_append() 將每個新的菜單項放到 菜單上。 ? 用 gtk_menu_item_new() 創建一個菜單項。這將是菜單的根(root),上面顯示的文本將自己出現在菜單欄上。 ? 用 gtk_menu_item_set_submenu() 將菜單綁定到根菜單項(就是上一步創建的那個)。 ? 用 gtk_menu_bar_new 創建一個新的菜單欄。在一個菜單欄上創建一系列菜單時這步只要做一次就行了。 ? 用 gtk_menu_bar_append() 將根菜單項放到菜單欄上。 創建一個彈出菜單和上面的幾乎是一樣,只是在設置回調函數時,如下: ~~~ g_signal_connect_swapped (G_OBJECT (widget), "event", G_CALLBACK (handler), G_OBJECT (menu)); ~~~ 其中widget是你要綁定到的構件,handler是處理函數,而menu是一個用 gtk_menu_new() 創建的菜單。它可以是一個也被菜單欄彈出的菜單。 ### 看下面具體的例子: ### ![](https://box.kancloud.cn/2016-08-24_57bd779a35f97.jpg) ~~~ /*File:menu_item.c *Date:2013-11-23 *Author:sjin *Mail:413977243@qq.com */ #include <gtk/gtk.h> #include <stdio.h> static void menuitem_response(gchar *string) { printf("%s\n",string); } static int button_press(GtkWidget *widget,GdkEvent *event) { if(event->type == GDK_BUTTON_PRESS){ GdkEventButton *bevent = (GdkEventButton *)event; gtk_menu_popup(GTK_MENU(widget),NULL,NULL,NULL,NULL,bevent->button,bevent->time); /*告訴調用代碼我們已經處理這個事件,*/ return TRUE; } /*else 未處理*/ return FALSE; } gint delete_event( GtkWidget *widget,GdkEvent *event,gpointer data ) { /* 如果你的 "delete_event" 信號處理函數返回 FALSE,GTK 會發出 "destroy" 信號。 * 返回 TRUE,你不希望關閉窗口。 * 當你想彈出“你確定要退出嗎?”對話框時它很有用。*/ g_print ("delete event occurred\n"); /* 改 TRUE 為 FALSE 程序會關閉,關閉時調用destroy()。*/ return FALSE; } /* 另一個回調函數 */ void destroy( GtkWidget *widget,gpointer data ) { gtk_main_quit (); } int main( int argc, char *argv[] ) { /* GtkWidget 是構件的存儲類型 */ GtkWidget *window; GtkWidget *menu; GtkWidget *menu_bar; GtkWidget *root_menu; GtkWidget *menu_items; GtkWidget *vbox; GtkWidget *button; char buf[128]; int i; /* 這個函數在所有的 GTK 程序都要調用。參數由命令行中解析出來并且送到該程序中*/ gtk_init (&argc, &argv); /* 創建一個新窗口 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /*設置窗口標題*/ gtk_window_set_title(GTK_WINDOW(window),"My first program helloworld!"); /* 當窗口收到 "delete_event" 信號 (這個信號由窗口管理器發出,通常是“關閉” * 選項或是標題欄上的關閉按鈕發出的),我們讓它調用在前面定義的 delete_event() 函數。 * 傳給回調函數的 data 參數值是 NULL,它會被回調函數忽略。*/ g_signal_connect (G_OBJECT (window), "delete_event",G_CALLBACK (delete_event), NULL); /* 在這里我們連接 "destroy" 事件到一個信號處理函數。 * 對這個窗口調用 gtk_widget_destroy() 函數或在 "delete_event" 回調函數中返回 FALSE 值 * 都會觸發這個事件。*/ g_signal_connect (G_OBJECT (window), "destroy",G_CALLBACK (destroy), NULL); /* 設置窗口邊框的寬度。*/ gtk_container_set_border_width (GTK_CONTAINER (window), 10); /*創建窗口寬度*/ gtk_widget_set_size_request(GTK_WIDGET(window),200,100); /************* * 初始化菜單構件 * 記住這里永遠不要用gtk_widget_show()函數來顯示菜單控件 * 這個是包含菜單項的菜單,運行程序時點擊會彈出來 ************/ menu = gtk_menu_new(); /*********×××××××××× * * * ***********/ for(i = 0; i < 3; i++){ /*將名稱復制到buf*/ sprintf(buf,"undetmenu-%d",i); /*創建一個菜單項*/ menu_items = gtk_menu_item_new_with_label(buf); /*將它添加到菜單*/ gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_items); /*當菜單被選中時的回調函數*/ g_signal_connect_swapped(G_OBJECT(menu_items),"activate",G_CALLBACK(menuitem_response),g_strdup(buf)); /*顯示構件*/ gtk_widget_show(menu_items); } /***************** *這個是根菜單,將成為現實在菜單欄上的標簽 *這里不會附上信號處理函數,因為它只是在被按下時彈出的其余的菜單 *****************/ root_menu = gtk_menu_item_new_with_label("根菜單"); gtk_widget_show(root_menu); /************** *指定想要穿件的menu成為根菜單 ***************/ gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menu),menu); /*將一個菜單和一個按鈕放到縱向盒子里面*/ vbox = gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(window),vbox); gtk_widget_show(vbox); /**************** *創建一個菜單欄,并添加到主窗口 * ***************/ menu_bar = gtk_menu_bar_new(); gtk_box_pack_start(GTK_BOX(vbox),menu_bar,FALSE,FALSE,2); gtk_widget_show(menu_bar); button = gtk_button_new_with_label("點擊"); g_signal_connect_swapped(G_OBJECT(button),"event",G_CALLBACK(button_press),menu); gtk_box_pack_end(GTK_BOX(vbox),button,TRUE,TRUE,2); gtk_widget_show(button); /************** *最后把慘淡想添加到菜單欄上 * ***************/ gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar),root_menu); gtk_widget_show(window); gtk_main (); return 0; } ~~~ ### 下面是利用gtk_item_factory來實現菜單選項: ~~~ /***************** *使用套件生成菜單方式 *gtk_item_factory ************/ /*File:menu_item2.c *Date:2014-03-23 *Author:sjin *Mail:413977243@qq.com */ #include <gtk/gtk.h> #include <stdio.h> /*必要的回調函數*/ static void print_hello(GtkWidget *w,gpointer data) { g_message("Hello,World!\n"); } /******************** * 這是用來生成新慘淡的GtkItemFactoryEntry結構 * 第一項 菜單路徑 下劃線后字母指出慘淡打開的快捷鍵 * 第二項:這個條目的快捷鍵 * 第三項:回調函數 * 第四項,回調動作 * 第五項:項類型用 * NULL -> "Item" * "" "Item" * "<Title>" 標題 * "<Item>" 創建一個簡單的項 * "<CheckItem>" 創建一個檢查項 * "<ToggleItem>" 創建一個開關項 * "<RadioItem>" 創建一個選擇項 * <path> 選擇項鏈接到的路徑 * "<Separator>" 分割線 * "Branch" 創建一個包含子項的項 * "LastBranch" 創建一個右對齊的分支 *******************/ static GtkItemFactoryEntry menu_items[] = { {"/_File", NULL, NULL,0,"<Branch>"}, {"/File/_New", "<control>N", print_hello,0,NULL}, {"/File/_Open", "<control>O", print_hello,0,NULL}, {"/File/_Save", "<control>S" ,print_hello,0,NULL}, {"/File/Save _As", NULL,NULL,0,NULL}, {"/File/sepl", NULL,NULL,0,"<Separator>"}, {"/File/Quit", "<control>Q", gtk_main_quit,0,NULL}, {"/_Options", NULL,NULL,0,"<Branch>"}, {"/Options/Test", NULL,NULL,0,NULL}, {"/_Help", NULL,NULL,0,"<LastBranch>"}, {"/Help/About", NULL,NULL,0,NULL}, }; void get_main_menu(GtkWidget *window,GtkWidget **menu_bar) { GtkItemFactory *item_factory; GtkAccelGroup *accel_group; gint nmenu_items = sizeof(menu_items)/sizeof(menu_items[0]); accel_group = gtk_accel_group_new(); /************** *這個函數初始化套件 *參數1:菜單類型- *參數2:菜單路徑 *參數3:指向一個gtk_accel_group 的指針 * ***************/ item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR,"<main>",accel_group); /*生成菜單項,把數組里想的數量,數組自身,和菜單項的任意 * 回調函數以此傳遞給套件*/ gtk_item_factory_create_items(item_factory,nmenu_items,menu_items,NULL); /*把新的加速組綁定到窗口*/ gtk_window_add_accel_group(GTK_WINDOW(window),accel_group); if(menu_bar){ /*返回套件已經創建的菜單欄*/ *menu_bar = gtk_item_factory_get_widget(item_factory,"<main>"); } } gint delete_event( GtkWidget *widget,GdkEvent *event,gpointer data ) { /* 如果你的 "delete_event" 信號處理函數返回 FALSE,GTK 會發出 "destroy" 信號。 * 返回 TRUE,你不希望關閉窗口。 * 當你想彈出“你確定要退出嗎?”對話框時它很有用。*/ g_print ("delete event occurred\n"); /* 改 TRUE 為 FALSE 程序會關閉,關閉時調用destroy()。*/ return TRUE; } /* 另一個回調函數 */ void destroy( GtkWidget *widget,gpointer data ) { gtk_main_quit (); } int main( int argc, char *argv[] ) { /* GtkWidget 是構件的存儲類型 */ GtkWidget *window; GtkWidget *menu_bar; GtkWidget *vbox; /* 這個函數在所有的 GTK 程序都要調用。參數由命令行中解析出來并且送到該程序中*/ gtk_init (&argc, &argv); /* 創建一個新窗口 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /*設置窗口標題*/ gtk_window_set_title(GTK_WINDOW(window),"My first program helloworld!"); /* 當窗口收到 "delete_event" 信號 (這個信號由窗口管理器發出,通常是“關閉” * 選項或是標題欄上的關閉按鈕發出的),我們讓它調用在前面定義的 delete_event() 函數。 * 傳給回調函數的 data 參數值是 NULL,它會被回調函數忽略。*/ g_signal_connect (G_OBJECT (window), "delete_event",G_CALLBACK (delete_event), NULL); /* 在這里我們連接 "destroy" 事件到一個信號處理函數。 * 對這個窗口調用 gtk_widget_destroy() 函數或在 "delete_event" 回調函數中返回 FALSE 值 * 都會觸發這個事件。*/ g_signal_connect (G_OBJECT (window), "destroy",G_CALLBACK (destroy), NULL); /* 設置窗口邊框的寬度。*/ gtk_container_set_border_width (GTK_CONTAINER (window), 10); /*創建窗口寬度*/ gtk_widget_set_size_request(GTK_WIDGET(window),200,100); vbox = gtk_vbox_new(FALSE,1); gtk_container_add(GTK_CONTAINER(window),vbox); gtk_widget_show(vbox); get_main_menu(window,&menu_bar); gtk_box_pack_start(GTK_BOX(vbox),menu_bar,FALSE,TRUE,0); gtk_widget_show(menu_bar); gtk_widget_show(window); gtk_main (); return 0; } ~~~ 問題:在運行后無法將菜單欄顯示出來的的問題? 運行程序需要ROOT權限。具體原因不清楚。。
                  <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>

                              哎呀哎呀视频在线观看