一、分享下自已学习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);
}
三、内容分类方便后期修改和移植