(一)、学习Linux下C语言 GTK  UI框架(1)

分享下自已学习Linux下C语言 GTK  UI框架的成长记录

1.首先在Linux系统中安装下GTK环境和开发工具,我的开发工具是Clion,选择自已喜欢和习惯的开发工具。

2.考虑到UI框架扩展性,实现多窗口,文件太多了,所以首先大概规划下,要不然代码多了在一个文件中,查找代码下来,或修改时出现的问题。

3.一个窗口中,用main.c的入口文件。首先我把文件的结构分为:

      main.c   —— 主窗体文件         

      Header  ——文件夹下放.h头文件

      Source  ——文件夹下放.c源文件(一)、学习Linux下C语言 GTK  UI框架(1)

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);
}

内容分类方便后期修改和移植