(一)、学习Linux下C语言 GTK UI框架(1)
一、分享下自已学习Linux下C语言 GTK UI框架的成长记录
1.首先在Linux系统中安装下GTK环境和开发工具,我的开发工具是Clion,选择自已喜欢和习惯的开发工具。
2.考虑到UI框架扩展性,实现多窗口,文件太多了,所以首先大概规划下,要不然代码多了在一个文件中,查找代码下来,或修改时出现的问题。
3.一个窗口中,用main.c的入口文件。首先我把文件的结构分为:
main.c —— 主窗体文件
Header ——文件夹下放.h头文件
Source ——文件夹下放.c源文件
4.上图上GTK 框架的结构
二、代码如下
1. main.c
#include <gtk/gtk.h> #include "Header/mainContainer.h" int main(int argc, char *argv[]) { gtk_init(&argc, &argv); createWindow(); return 0; }
2.Header/mainContainer.h
#ifndef READER_MANAGER_MAINCONTAINER_H #define READER_MANAGER_MAINCONTAINER_H #include <gtk/gtk.h> void createMainContainer(GtkWidget *vbox); void createWindow(); #endif //READER_MANAGER_MAINCONTAINER_H
3.Source/mainContainer.c
#include "../Header/mainContainer.h" #include "../Header/menuItem.h" #include "../Header/toolbarItem.h" #include "../Header/statusBar.h" #include "../Header/leftContainer.h" #include "../Header/rightContainer.h" void createMainContainer(GtkWidget *vbox){ createLeftContainer(vbox,createRightContainer()); } void createWindow(){ GtkWidget *window; GtkWidget *vbox; window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "演示版软件"); gtk_window_set_default_size(GTK_WINDOW(window), 1000, 600); vbox = gtk_vbox_new(FALSE, 0); createMenu(vbox);//菜单栏 createToolbar(vbox);//工具栏 createMainContainer(vbox);//中间主容器 createStatusBar(vbox);//底部的状态栏 gtk_container_add(GTK_CONTAINER(window), vbox); g_signal_connect(GTK_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); gtk_main(); }
4.Header/leftContainer.h
#ifndef READER_MANAGER_LEFTCONTAINER_H #define READER_MANAGER_LEFTCONTAINER_H #include <gtk/gtk.h> GtkWidget * createLeftContainer(GtkWidget *vbox,GtkWidget * rightContent); #endif //READER_MANAGER_LEFTCONTAINER_H
5.Source/leftContainer.c
#include "../Header/leftContainer.h" GtkWidget * createLeftContainer(GtkWidget *vbox,GtkWidget * rightContent){ GtkWidget* leftContent; GtkWidget* leftButton; leftContent = gtk_hpaned_new(); leftButton = gtk_button_new_with_label("leftContent"); gtk_widget_set_size_request(leftButton,300,50); gtk_box_pack_start(GTK_CONTAINER(vbox), leftContent, TRUE, TRUE, 0); gtk_paned_add1(GTK_PANED(leftContent),leftButton); gtk_paned_add2(GTK_PANED(leftContent),rightContent); return leftContent; }
6.Header/rightContainer.h
#ifndef READER_MANAGER_RIGHTCONTAINER_H #define READER_MANAGER_RIGHTCONTAINER_H #include <gtk/gtk.h> GtkWidget * createRightContainer(); #endif //READER_MANAGER_RIGHTCONTAINER_H
7.Source/rightContainer.c
#include "../Header/rightContainer.h" GtkWidget * createRightContainer(){ GtkWidget* rightContent; GtkWidget* rightButton; rightContent = gtk_vpaned_new(); rightButton = gtk_button_new_with_label("rightContent"); gtk_paned_add1(GTK_PANED(rightContent),rightButton); return rightContent; }
8.Header/menuItem.h
#ifndef READER_MANAGER_MENUITEM_H #define READER_MANAGER_MENUITEM_H #include <gtk/gtk.h> void itemPressed(GtkMenuItem *menuItem, gpointer data); void createMenu(GtkMenuItem *vbox); GtkWidget* createFileMenuItem(); #endif //READER_MANAGER_MENUITEM_H
9.Source/menuItem.c
#include "../Header/menuItem.h" void itemPressed(GtkMenuItem *menuItem, gpointer data); void createMenu(GtkMenuItem *vbox){ GtkWidget *menubar; GtkWidget *menubarBox; menubar = gtk_menu_bar_new(); gtk_menu_bar_append(menubar, createFileMenuItem()); gtk_menu_bar_append(menubar, gtk_menu_item_new_with_mnemonic("_Edit")); gtk_menu_bar_append(menubar, gtk_menu_item_new_with_mnemonic("_Help")); menubarBox = gtk_handle_box_new(); gtk_container_add(GTK_CONTAINER(menubarBox), menubar); gtk_box_pack_start(GTK_BOX(vbox), menubarBox, FALSE, FALSE, 0); } GtkWidget* createFileMenuItem() { GtkWidget *rootFileItem; GtkWidget *fileMenu; GtkWidget *exportMenuItem; GtkWidget *exitMenuItem; rootFileItem = gtk_menu_item_new_with_mnemonic("_File"); fileMenu = gtk_menu_new(); exportMenuItem = gtk_menu_item_new_with_label("Export"); exitMenuItem = gtk_menu_item_new_with_label("Close"); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), exportMenuItem); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu),gtk_separator_menu_item_new()); gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), exitMenuItem); gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootFileItem), fileMenu); g_signal_connect(GTK_OBJECT(exportMenuItem), "activate", G_CALLBACK(itemPressed), "Open ...."); g_signal_connect(GTK_OBJECT(exitMenuItem), "activate", G_CALLBACK(gtk_main_quit), NULL); return rootFileItem; } void itemPressed(GtkMenuItem *menuItem, gpointer data) { g_print("%s\n", data); }
10.Header/toolbarItem.h
#ifndef READER_MANAGER_TOOLBARITEM_H #define READER_MANAGER_TOOLBARITEM_H #include <gtk/gtk.h> void createToolbar(GtkMenuItem *vbox); GtkToolItem* createToolItem(gchar *stock_id, gchar *text); #endif //READER_MANAGER_TOOLBARITEM_H
11.Source/toolbarItem.c
#include "../Header/toolbarItem.h" GtkToolItem* createToolItem(gchar *stock_id, gchar *text); void createToolbar(GtkMenuItem *vbox){ GtkWidget *toolbar; GtkWidget *toolbarBox; toolbar = gtk_toolbar_new(); gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_OPEN, "Open"), 0); gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Save"), 1); toolbarBox = gtk_handle_box_new(); gtk_container_add(GTK_CONTAINER(toolbarBox), toolbar); gtk_box_pack_start(GTK_BOX(vbox), toolbarBox, FALSE, FALSE, 0); } // 建立一個內含按鈕、文字與圖片的GtkToolItem GtkToolItem* createToolItem(gchar *stock_id, gchar *text) { GtkToolItem *open; GtkWidget *box; GtkWidget *label; GtkWidget *image; GtkWidget *button; open = gtk_tool_item_new(); gtk_tool_item_set_tooltip_text(open, "Open File.."); box = gtk_vbox_new(FALSE, 0); image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_SMALL_TOOLBAR); label = gtk_label_new(text); gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0); button = gtk_button_new(); gtk_container_add(GTK_CONTAINER(button), box); gtk_container_add(GTK_CONTAINER(open), button); return open; }
12.Header/statusBar.h
#ifndef READER_MANAGER_STATUSBAR_H #define READER_MANAGER_STATUSBAR_H #include <gtk/gtk.h> void createStatusBar(GtkWidget *vbox); #endif //READER_MANAGER_STATUSBAR_H
13.Source/statusBar.c
#include "../Header/statusBar.h" void createStatusBar(GtkWidget *vbox){ GtkWidget *statusbar; gint contextId; statusbar = gtk_statusbar_new(); contextId = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "Editor Messages"); gtk_statusbar_push(GTK_STATUSBAR(statusbar),contextId, "Gtk StatusBar Example"); gtk_box_pack_start(GTK_BOX(vbox), statusbar, FALSE, FALSE, 0); gtk_widget_set_size_request(statusbar,300,50); }
三、内容分类方便后期修改和移植