一步一步學GTK+之多窗口_第1頁
一步一步學GTK+之多窗口_第2頁
一步一步學GTK+之多窗口_第3頁
一步一步學GTK+之多窗口_第4頁
一步一步學GTK+之多窗口_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、一、按照一定的邏輯去切割代碼并實現(xiàn)多窗口上一篇中完成了一個簡單的軟件界面,考慮到這個軟件主要的目的是在軟件中容納很多控件,一個窗口中不可能全部包含進去的。所以這篇內(nèi)容是我們一起來學下多窗口。既然我們要實現(xiàn)多窗口,那么就不能把所有代碼放到一個文件中,這樣會很混亂的,一個文件來放一個窗口,然后用main.c的入口文件來調(diào)度它們。使用我先把文件的結構分為:main.c入口文件window_main.c主窗口文件window_test.c測試用的子窗口文件common_func.c各個窗口調(diào)用的公共函數(shù)文件既然涉及到公共函數(shù)會被其他窗口調(diào)用,我們還需要建立一些頭文件,在其中加入一些宏來防止重復包含文件

2、。common_func.h#ifndef _COMMON_FUNC_H_#define _COMMON_FUNC_H_#include <gtk/gtk.h>GdkPixbuf *create_pixbuf(const gchar * filename);void toggle_display(GtkWidget *widget, gpointer oneofwidget);#endif / _COMMON_FUNC_H_common.c#include "common_func.h"/* Description: 從一個圖片中獲取信息得到pixbuf par

3、am: gchar filename*/GdkPixbuf *create_pixbuf(const gchar * filename) GdkPixbuf *pixbuf; GError *error = NULL; /* * 函數(shù)gdk_pixbuf_new_from_file() 從一個圖片文件中加載圖象數(shù)據(jù),從而生成一個新的 pixbuf, * 至于文件中包含圖象的格式,是由系統(tǒng)自動檢測的。如果該函數(shù)返回值是NULL 的話,程序就會出現(xiàn)錯誤。 */ pixbuf = gdk_pixbuf_new_from_file(filename, &error); if(!pixbuf)

4、fprintf(stderr, "%sn", error->message); g_error_free(error); return pixbuf;/根據(jù)菜單欄的選擇(check)控制一些構件的顯示和隱藏void toggle_display(GtkWidget *widget, gpointer oneofwidget) if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget) gtk_widget_show(oneofwidget); else gtk_widget_hide(oneofwidg

5、et); 以上只是把原來的兩個函數(shù)提取出來,并添加了頭文件。window_main.h#ifndef _WINDOW_MAIN_H_#define _WINDOW_MAIN_H_#include <gtk/gtk.h>#include "common_func.h"GtkWidget *create_main_window();#endif / _WINDOW_MAIN_H_window_main.c#include "common_func.h"#include "window_main.h"GtkWidget *cre

6、ate_main_window()/創(chuàng)建主窗口 GtkWidget *window; GtkWidget *vbox; /盒裝容器 GtkWidget *menubar; /菜單欄 GtkWidget *menutoggle, *menu_tog_toggle,*menu_tog_toolbar, *menu_tog_statusbar; /界面開關菜單 /GtkWidget *menu_about, *menu_about_us; /幫助菜單 GtkWidget *toolbar; /工具欄 GtkToolItem *tool_exit, *tool_sep,*tool_about; Gtk

7、Widget *statusbar; /狀態(tài)欄 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "一步一步學GTK+ DEMO"); gtk_window_set_default_size(GTK_WINDOW(window), 500, 400); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); /*函數(shù)gtk_window_set_icon() 是為窗口設置圖標用的

8、,函數(shù)create_pixbuf是我們自定義的,目的是從一個圖片中獲取信息得到pixbuf。*/ gtk_window_set_icon(GTK_WINDOW(window), create_pixbuf("./images/bear.png"); /*創(chuàng)建一個盒裝容器并添加到窗口中*/ vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); /*創(chuàng)建菜單*/ menubar = gtk_menu_bar_new(); /代表整個菜單,是一個menu shell menut

9、oggle = gtk_menu_new(); /這里代表第一列菜單toggle ,也是一個menu shell menu_tog_toggle = gtk_menu_item_new_with_label("View"); menu_tog_toolbar = gtk_check_menu_item_new_with_label("show Toolbar"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_tog_toolbar),TRUE); menu_tog_statusbar =

10、 gtk_check_menu_item_new_with_label("show Statusbar"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_tog_statusbar),TRUE); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_tog_toggle), menutoggle); /widget toggle菜單加入 menutoggle menu shell gtk_menu_shell_append(GTK_MENU_SHELL(menutogg

11、le), menu_tog_toolbar); gtk_menu_shell_append(GTK_MENU_SHELL(menutoggle), menu_tog_statusbar); gtk_menu_shell_append(GTK_MENU_SHELL(menubar), menu_tog_toggle); /創(chuàng)建工具欄 toolbar = gtk_toolbar_new(); gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS); /設置工具欄樣式為圖標 gtk_container_set_border_wid

12、th(GTK_CONTAINER(toolbar), 0); /工具欄邊框大小 tool_exit = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT); /工具欄中的 “退出” 按鈕 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), tool_exit, -1); tool_sep = gtk_separator_tool_item_new(); /工具欄中按鈕之間的分割線 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), tool_sep, -1); tool_about = gtk

13、_tool_button_new_from_stock(GTK_STOCK_HELP); /工具欄中的“關于” 按鈕 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), tool_about, -1); statusbar = gtk_statusbar_new(); /*把菜單加入盒子容器*/ gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 1); /*把工具欄加入盒子容器*/ gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);

14、 /*把狀態(tài)欄加入盒子最下面*/ gtk_box_pack_end(GTK_BOX(vbox), statusbar, FALSE, TRUE, 1); /*以下是信號處理部分*/ /*關閉窗口時退出主循環(huán)*/ g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(tool_exit), "clicked",G_CALLBACK(gtk_main_quit), NULL); g_sign

15、al_connect(G_OBJECT(menu_tog_toolbar), "activate",G_CALLBACK(toggle_display), toolbar); g_signal_connect(G_OBJECT(menu_tog_statusbar), "activate",G_CALLBACK(toggle_display), statusbar); /*以下是顯示控件部分*/ /*開始顯示窗口*/ /gtk_widget_show_all(window); /gtk_main(); /return 0; return window;&

16、#160;這段也只是原來的代碼中,把顯示窗口的部分放在了一個函數(shù)中(create_main_window()),并把顯示窗口語句gtk_widget_show_all(window); 注釋掉,放在入口文件中調(diào)用,并注釋掉gtk_main()主循環(huán),主循環(huán)我們應該放在入口文件中,讓這個函數(shù)返回創(chuàng)建的窗口, return window;window_test.h#ifndef _WINDOW_TEST_H_#define _WINDOW_TEST_H_#include <gtk/gtk.h>#include "common_func.h"GtkWidget *cr

17、eate_test_window();#endif / _WINDOW_TEST_H_window_test.c#include "window_test.h" GtkWidget *create_test_window() /創(chuàng)建一個測試窗口 GtkWidget *window_test; window_test = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_show(window_test); /gtk_main(); /return 0; return window_test; 這里只用了個函數(shù)創(chuàng)建了一個空白的測試

18、窗口,并返回窗口。main.c#include <gtk/gtk.h>#include "common_func.h"#include "window_main.h"#include "window_test.h"int main( int argc, char *argv) GtkWidget *main_window ,*test_window; gtk_init(&argc, &argv); main_window=create_test_window(); /創(chuàng)建主窗口 test_window=cr

19、eate_main_window(); /創(chuàng)建測試窗口 gtk_widget_show_all(main_window); /顯示主窗口 gtk_widget_show_all(test_window); /顯示測試窗口 gtk_main(); return 0;在入口文件中,我們開始執(zhí)行創(chuàng)建窗口并顯示它們,這樣看起來就很簡潔,如果還有其他窗口我們用同樣的方法去增加就好了。在main.c中同一控制其他窗口的調(diào)度是很方便的。這樣分開后,代碼結構清晰,審查代碼也很方便了。以上的代碼僅僅是顯示了2個窗口,但點擊任意窗口右上角的X就會全部關閉.下面我們來實現(xiàn)2個窗口的交互。  二、

20、主窗口與子窗口的交互   在主窗口中的2個按鈕分別控制子窗口的顯示和隱藏(沒有使用摧毀和重新創(chuàng)建的方法),并在點擊子窗口的按鈕,改變主窗口的label控件中的文字。順便也簡單介紹下 按鈕(GtkButton)和標簽控件(GtkLabel).以及非盒裝容器GtkFixed。注意:由于本人能力有限,且暫時不想引入在結構體中包含函數(shù)指針的方法,姑且采用幾個全局變量,這樣其他文件中可通過extern修飾符進行引用。修改main.c#include <gtk/gtk.h>#include "common_func.h"#include "wi

21、ndow_main.h"#include "window_test.h"/GlobalGtkWidget *window_test = NULL; /子窗口本身GtkWidget *label = NULL; /主窗口中的labelint main( int argc, char *argv) GtkWidget *window_main; /主窗口不會在子窗口中使用,故不用聲明為全局變量 gtk_init(&argc, &argv); window_main=create_main_window(); /創(chuàng)建主窗口 window_test=cre

22、ate_test_window(); /創(chuàng)建測試窗口 gtk_widget_show_all(window_main); /顯示主窗口 /gtk_widget_show_all(window_test); /顯示測試窗口 gtk_main(); return 0;window_main.c#include "common_func.h"#include "window_main.h"extern GtkWidget *window_test;extern GtkWidget *label;/顯示子窗口void show_test_window(GtkWi

23、dget *widget) gchar *msg="子窗口打開了" gtk_label_set_text(GTK_LABEL(label),msg); gtk_widget_show_all(window_test);/隱藏子窗口void hide_test_window(GtkWidget *widget) gchar *msg="子窗口關閉了" gtk_label_set_text(GTK_LABEL(label),msg); gtk_widget_hide_all(window_test);GtkWidget *create_main_window

24、()/創(chuàng)建主窗口 GtkWidget *window; GtkWidget *vbox; /盒裝容器 GtkWidget *menubar; /菜單欄 GtkWidget *menutoggle, *menu_tog_toggle,*menu_tog_toolbar, *menu_tog_statusbar; /界面開關菜單 /GtkWidget *menu_about, *menu_about_us; /幫助菜單 GtkWidget *toolbar; /工具欄 GtkToolItem *tool_exit, *tool_sep,*tool_about; GtkWidget *statusb

25、ar; /狀態(tài)欄 GtkWidget *fixed; GtkWidget *test_button; GtkWidget *test2_button; window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "一步一步學GTK+ DEMO"); gtk_window_set_default_size(GTK_WINDOW(window), 500, 400); gtk_window_set_position(GTK_WINDOW(window), GTK_W

26、IN_POS_CENTER); /*函數(shù)gtk_window_set_icon() 是為窗口設置圖標用的,函數(shù)create_pixbuf是我們自定義的,目的是從一個圖片中獲取信息得到pixbuf。*/ gtk_window_set_icon(GTK_WINDOW(window), create_pixbuf("./images/bear.png"); /*創(chuàng)建一個盒裝容器并添加到窗口中*/ vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); /*創(chuàng)建菜單*/ menub

27、ar = gtk_menu_bar_new(); /代表整個菜單,是一個menu shell menutoggle = gtk_menu_new(); /這里代表第一列菜單toggle ,也是一個menu shell menu_tog_toggle = gtk_menu_item_new_with_label("View"); menu_tog_toolbar = gtk_check_menu_item_new_with_label("show Toolbar"); gtk_check_menu_item_set_active(GTK_CHECK_MEN

28、U_ITEM(menu_tog_toolbar),TRUE); menu_tog_statusbar = gtk_check_menu_item_new_with_label("show Statusbar"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_tog_statusbar),TRUE); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_tog_toggle), menutoggle); /widget toggle菜單加入 menutoggle menu

29、 shell gtk_menu_shell_append(GTK_MENU_SHELL(menutoggle), menu_tog_toolbar); gtk_menu_shell_append(GTK_MENU_SHELL(menutoggle), menu_tog_statusbar); gtk_menu_shell_append(GTK_MENU_SHELL(menubar), menu_tog_toggle); /創(chuàng)建工具欄 toolbar = gtk_toolbar_new(); gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOL

30、BAR_ICONS); /設置工具欄樣式為圖標 gtk_container_set_border_width(GTK_CONTAINER(toolbar), 0); /工具欄邊框大小 tool_exit = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT); /工具欄中的 “退出” 按鈕 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), tool_exit, -1); tool_sep = gtk_separator_tool_item_new(); /工具欄中按鈕之間的分割線 gtk_toolbar_insert(G

31、TK_TOOLBAR(toolbar), tool_sep, -1); tool_about = gtk_tool_button_new_from_stock(GTK_STOCK_HELP); /工具欄中的“關于” 按鈕 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), tool_about, -1); statusbar = gtk_statusbar_new(); fixed = gtk_fixed_new(); /*把菜單加入盒子容器*/ gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 1)

32、; /*把工具欄加入盒子容器*/ gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); /*把fixed加入主工作區(qū)*/ gtk_box_pack_start(GTK_BOX(vbox), fixed, FALSE, FALSE, 0); /*在fixed中放入一些按鈕和label*/ test_button=gtk_button_new_with_label("打開測試窗口"); gtk_fixed_put(GTK_FIXED(fixed), test_button, 150, 50); gtk_widg

33、et_set_size_request(test_button, 150, 35); test2_button=gtk_button_new_with_label("關閉測試窗口"); gtk_fixed_put(GTK_FIXED(fixed), test2_button, 300, 50); gtk_widget_set_size_request(test2_button, 80, 35); label = gtk_label_new("這里的文字會通過子窗口的操作來改變。"); gtk_fixed_put(GTK_FIXED(fixed), lab

34、el, 100, 100); gtk_widget_set_size_request(label, 300, 100); /*把狀態(tài)欄加入盒子最下面*/ gtk_box_pack_end(GTK_BOX(vbox), statusbar, FALSE, TRUE, 1); /*以下是信號處理部分*/ /*關閉窗口時退出主循環(huán)*/ g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(tool_exit),

35、"clicked",G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(menu_tog_toolbar), "activate",G_CALLBACK(toggle_display), toolbar); g_signal_connect(G_OBJECT(menu_tog_statusbar), "activate",G_CALLBACK(toggle_display), statusbar); g_signal_connect(G_OBJECT(test_but

36、ton), "clicked",G_CALLBACK(show_test_window), NULL); g_signal_connect(G_OBJECT(test2_button), "clicked",G_CALLBACK(hide_test_window), NULL); return window;window_test.c#include "window_test.h"/extern GtkWidget *window_test;extern GtkWidget *label;static gint delete_event() /* 如果你的 "delete_event" 信號處理函數(shù)返回 FALSE,GTK 會發(fā)出 "destroy"

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論