一、分享下自已学习Linux下C语言 GTK UI框架的成长记录 2
1.上次忘记贴CMakeLists.txt文件附上(注意用的是gtk+-2.0,版本高了有的方法没有)
cmake_minimum_required(VERSION 3.16)
project(Reader_Manager C)
set(CMAKE_CXX_STANDARD 11)
find_package (PkgConfig REQUIRED)
pkg_check_modules (GTK2 REQUIRED gtk+-2.0)
include_directories (${GTK2_INCLUDE_DIRS})
link_directories (${GTK2_LIBRARY_DIRS})
add_definitions (${GTK2_CFLAGS_OTHER})
#set(CMAKE_C_STANDARD 99)
add_executable(Reader_Manager
Header/interface.h
Source/interface.c
Header/callbacks.h
Source/callbacks.c
main.c
Header/menuItem.h
Source/menuItem.c
Source/toolbarItem.c
Header/toolbarItem.h
Header/statusBar.h
Source/statusBar.c
Source/mainContainer.c
Header/mainContainer.h
Header/leftContainer.h
Header/rightContainer.h
Source/leftContainer.c
Source/rightContainer.c
Source/ico.c
Header/ico.h
)
target_link_libraries (Reader_Manager ${GTK2_LIBRARIES})
2.主要完成了菜单栏和工具局
3.菜单栏更新Header/menuItem.h
//
// Created by asus on 2020/6/30.
//
#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();
GtkWidget* createReaderParamsSettingMenuItem();
GtkWidget* createOtherOerationMenuItem();
GtkWidget* createCommParamsSettingMenuItem();
GtkWidget* createLanguageSettingMenuItem();
GtkWidget* createHelpMenuItem();
#endif //READER_MANAGER_MENUITEM_H
4.菜单栏更新Source/menuItem.c
#include "../Header/menuItem.h"
void itemPressed(GtkMenuItem *menuItem, gpointer data);
GtkWidget* createFileMenuItem();
GtkWidget* createReaderParamsSettingMenuItem();
GtkWidget* createOtherOerationMenuItem();
GtkWidget* createCommParamsSettingMenuItem();
GtkWidget* createLanguageSettingMenuItem();
GtkWidget* createHelpMenuItem();
void createMenu(GtkMenuItem *vbox){
GtkWidget *menubar;
GtkWidget *menubarBox;
menubar = gtk_menu_bar_new();
gtk_menu_bar_append(menubar, createFileMenuItem());
gtk_menu_bar_append(menubar, createReaderParamsSettingMenuItem());
gtk_menu_bar_append(menubar, createOtherOerationMenuItem());
gtk_menu_bar_append(menubar, createCommParamsSettingMenuItem());
gtk_menu_bar_append(menubar, createLanguageSettingMenuItem());
gtk_menu_bar_append(menubar, createHelpMenuItem());
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;
}
GtkWidget* createReaderParamsSettingMenuItem() {
GtkWidget *rootFileItem;
GtkWidget *paramsMenu;
GtkWidget *commModeMenu;
GtkWidget *workModeMenuItem;
GtkWidget *antennaSetMenuItem;
GtkWidget *tagTypeMenuItem;
GtkWidget *bidirectionalTagMenuItem;
GtkWidget *deviceNoMenuItem;
rootFileItem = gtk_menu_item_new_with_mnemonic("_Reader Params Setting");
paramsMenu = gtk_menu_new();
workModeMenuItem = gtk_menu_item_new_with_label("Work Mode");
commModeMenu = gtk_menu_item_new_with_label("Communication Mode");
antennaSetMenuItem = gtk_menu_item_new_with_label("Antenna Set");
tagTypeMenuItem = gtk_menu_item_new_with_label("Tag Type");
bidirectionalTagMenuItem = gtk_menu_item_new_with_label("Bidirectional Tag Param Config");
deviceNoMenuItem = gtk_menu_item_new_with_label("Device No");
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), workModeMenuItem);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), commModeMenu);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), antennaSetMenuItem);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), tagTypeMenuItem);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), bidirectionalTagMenuItem);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), deviceNoMenuItem);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootFileItem), paramsMenu);
return rootFileItem;
}
GtkWidget* createOtherOerationMenuItem(){
GtkWidget *rootFileItem;
GtkWidget *paramsMenu;
GtkWidget *buzzerVoiceMenuItem;
GtkWidget *ledLampMenu;
GtkWidget *relayControlMenuItem;
GtkWidget *firmwareUpdateMenuItem;
GtkWidget *tagInfoOutputMenuItem;
GtkWidget *factoryDataResetMenuItem;
GtkWidget *softwareResetMenuItem;
GtkWidget *deviceConfigInfoMenuItem;
rootFileItem = gtk_menu_item_new_with_mnemonic("_Other Operation");
paramsMenu = gtk_menu_new();
buzzerVoiceMenuItem = gtk_menu_item_new_with_label("Buzzer Voice");
ledLampMenu = gtk_menu_item_new_with_label("LED Lamp");
relayControlMenuItem = gtk_menu_item_new_with_label("Relay Control");
firmwareUpdateMenuItem = gtk_menu_item_new_with_label("Firware Update");
tagInfoOutputMenuItem = gtk_menu_item_new_with_label("Tag Info Output");
factoryDataResetMenuItem = gtk_menu_item_new_with_label("Factory Setting");
softwareResetMenuItem = gtk_menu_item_new_with_label("Reset");
deviceConfigInfoMenuItem = gtk_menu_item_new_with_label("Device Config Info");
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), buzzerVoiceMenuItem);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), ledLampMenu);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), relayControlMenuItem);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), firmwareUpdateMenuItem);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), tagInfoOutputMenuItem);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), factoryDataResetMenuItem);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), softwareResetMenuItem);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), deviceConfigInfoMenuItem);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootFileItem), paramsMenu);
return rootFileItem;
}
GtkWidget* createCommParamsSettingMenuItem(){
GtkWidget *rootFileItem;
GtkWidget *paramsMenu;
GtkWidget *wifiParamsSetMenu;
GtkWidget *networkParamsSetMenuItem;
GtkWidget *GPSConfigMenuItem;
GtkWidget *HTTPConfigMenuItem;
GtkWidget *TCPConfigMenuItem;
rootFileItem = gtk_menu_item_new_with_mnemonic("_Communication Params Setting");
paramsMenu = gtk_menu_new();
networkParamsSetMenuItem = gtk_menu_item_new_with_label("Network Params Setting");
wifiParamsSetMenu = gtk_menu_item_new_with_label("Wifi Config");
GPSConfigMenuItem = gtk_menu_item_new_with_label("GPS Config");
HTTPConfigMenuItem = gtk_menu_item_new_with_label("HTTP Config");
TCPConfigMenuItem = gtk_menu_item_new_with_label("TCP Config");
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), networkParamsSetMenuItem);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), wifiParamsSetMenu);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), GPSConfigMenuItem);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), HTTPConfigMenuItem);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), TCPConfigMenuItem);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootFileItem), paramsMenu);
return rootFileItem;
}
GtkWidget* createLanguageSettingMenuItem(){
GtkWidget *rootFileItem;
GtkWidget *paramsMenu;
GtkWidget *chineseMenu;
GtkWidget *englistMenuItem;
rootFileItem = gtk_menu_item_new_with_mnemonic("_Language Setting");
paramsMenu = gtk_menu_new();
englistMenuItem = gtk_menu_item_new_with_label("Englist(英语)");
chineseMenu = gtk_menu_item_new_with_label("Chinese(中文)");
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), englistMenuItem);
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), chineseMenu);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootFileItem), paramsMenu);
return rootFileItem;
}
GtkWidget* createHelpMenuItem(){
GtkWidget *rootFileItem;
GtkWidget *paramsMenu;
GtkWidget *aboutMenuItem;
rootFileItem = gtk_menu_item_new_with_mnemonic("_Help");
paramsMenu = gtk_menu_new();
aboutMenuItem = gtk_menu_item_new_with_label("About");
gtk_menu_shell_append(GTK_MENU_SHELL(paramsMenu), aboutMenuItem);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootFileItem), paramsMenu);
return rootFileItem;
}
void itemPressed(GtkMenuItem *menuItem, gpointer data) {
g_print("%s\n", data);
}
5.工具栏更新Header/toolbarItem.h
#ifndef READER_MANAGER_TOOLBARITEM_H
#define READER_MANAGER_TOOLBARITEM_H
#include <gtk/gtk.h>
#include "ico.h"
void createToolbar(GtkMenuItem *vbox);
GtkToolItem* createToolItem(gchar *stock_id, gchar *text,char *image);
#endif //READER_MANAGER_TOOLBARITEM_H
6.工具栏更新Source/toolbarItem.c
#include "../Header/toolbarItem.h"
GtkToolItem* createToolItem(gchar *stock_id, gchar *text,char *image);
void createToolbar(GtkMenuItem *vbox){
GtkWidget *toolbar;
GtkWidget *toolbarBox;
toolbar = gtk_toolbar_new();
GtkWidget *sep;
GtkWidget *sep2;
GtkWidget *sep3;
GtkWidget *sep4;
int index = 0;
//gtk_menu_bar_append
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_OPEN, "Start",icoStart), index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Stop",icoStop), ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Clear",icoClear), ++index);
sep = gtk_separator_tool_item_new();
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), sep, ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Network Config",icoNetwork), ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Wifi Config",icoWifiConfig), ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "GPS Config",icoGPSConfig), ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Http Config",icoHTTPConfig), ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "TCP Config",icoTCPConfig), ++index);
sep2 = gtk_separator_tool_item_new();
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), sep2, ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Work Mode",icoWorkMode), ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Comm Mode",icoCommunicationMode), ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Antenna CTL",icoAntennaSet), ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Tag Type",icoTagType), ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Tag CTL",icoDoubleTag), ++index);
sep3 = gtk_separator_tool_item_new();
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), sep3, ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Device No",icoDeviceNo), ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Buzzer CTL",icoBuzzer), ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "LED CTL",icoLEDLamp), ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Relay CTL",icoRelay), ++index);
sep4 = gtk_separator_tool_item_new();
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), sep4, ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "FM Update",icoFirmwareUpdate), ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Info Output",icoTagInfoOutput), ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Factory Setting",icoFactorySet), ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "SW Reset",icoReset), ++index);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),createToolItem(GTK_STOCK_SAVE, "Device Info",icoDeviceInfo), ++index);
int type;
type = 0;
if(type == 0){
//Fix
gtk_container_set_border_width(GTK_CONTAINER(toolbar), 2);
gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 5);
}else{
//Move
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,char *ico) {
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);
//gtk_table_attach_defaults(GTK_TABLE(table), image, 0, 1, 1, 2);
image = gtk_image_new_from_file(ico);
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;
}
7.工具栏增加图标Header/ice.h
#ifndef READER_MANAGER_ICO_H
#define READER_MANAGER_ICO_H
char icoStart[100];
char icoStop[100];
char icoClear[100];
char icoNetwork[100];
char icoWifiConfig[100];
char icoGPSConfig[100];
char icoTCPConfig[100];
char icoHTTPConfig[100];
char icoWorkMode[100];
char icoCommunicationMode[100];
char icoAntennaSet[100];
char icoTagType[100];
char icoDoubleTag[100];
char icoDeviceNo[100];
char icoBuzzer[100];
char icoLEDLamp[100];
char icoRelay[100];
char icoFirmwareUpdate[100];
char icoTagInfoOutput[100];
char icoFactorySet[100];
char icoReset[100];
char icoDeviceInfo[100];
#endif //READER_MANAGER_ICO_H
8.工具栏增加图标Source/ice.c
char icoStart[100] = {"../ico/play_fill.png"};
char icoStop[100] = {"../ico/stop.png"};
char icoClear[100] = {"../ico/clear.png"};
char icoNetwork[100] = {"../ico/network_settings.png"};
char icoWifiConfig[100] = {"../ico/wifi.png"};
char icoGPSConfig[100] = {"../ico/gps.png"};
char icoTCPConfig[100] = {"../ico/server.png"};
char icoHTTPConfig[100] = {"../ico/http.png"};
char icoWorkMode[100] = {"../ico/operation.png"};
char icoCommunicationMode[100] = {"../ico/interface_management.png"};
char icoAntennaSet[100] = {"../ico/si_glyph_antenna_1.png"};
char icoTagType[100] = {"../ico/48_tags_06.png"};
char icoDoubleTag[100] = {"../ico/double_tag.png"};
char icoDeviceNo[100] = {"../ico/equipment.png"};
char icoBuzzer[100] = {"../ico/notification_fill.png"};
char icoLEDLamp[100] = {"../ico/led.png"};
char icoRelay[100] = {"../ico/relays.png"};
char icoFirmwareUpdate[100] = {"../ico/upgrade.png"};
char icoTagInfoOutput[100] = {"../ico/output.png"};
char icoFactorySet[100] = {"../ico/factory_setting.png"};
char icoReset[100] = {"../ico/reset.png"};
char icoDeviceInfo[100] = {"../ico/device_info.png"};
9.左侧的部分还没有完善,今天就到这里,明天继续更新