1. 程式人生 > >GTK程式demo,帶工具欄和狀態列

GTK程式demo,帶工具欄和狀態列

main.c原始碼:

#include <gtk/gtk.h>

/*
 *@Description:從一個圖片檔案獲取資訊得到pixbuf
 *@param: gchar filename
 */

GdkPixbuf *create_pixbuf(const gchar* filename)
{
	GdkPixbuf *pixbuf;
	GError *error = NULL;
	pixbuf = gdk_pixbuf_new_from_file(filename,&error);
	if(!pixbuf){
		fprintf(stderr,"%s\n",error->message);
		g_error_free(error);
	}
	return pixbuf;
}

void menu_pressed(GtkWidget *widget,gpointer window)
{
	gchar *str;
	str = g_strdup_printf("you clicked one menu item");
	gtk_statusbar_push(GTK_STATUSBAR(window),gtk_statusbar_get_context_id(GTK_STATUSBAR(window),str),str);
	g_free(str);
}

//根據選單欄的選擇(ckeck) 控制一些構建的顯示和隱藏
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(oneofwidget);
	}
}

/*選擇(Check)選單選項(menu item)*/
int main(int argc,char *argv[])
{
	GtkWidget *window;
	GtkWidget *vbox;	//盒裝容器
	GtkWidget *menubar;	//選單欄
	GtkWidget *menutoggle,*menu_tog_toggle,*menu_tog_toolbar,*menu_tog_statusbar;	//介面開關選單
	GtkWidget *toolbar;	//工具欄
	GtkToolItem *tool_exit,*tool_sep,*tool_about;

	GtkWidget *statusbar;	//狀態列

	gtk_init(&argc,&argv);
	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);
	gtk_window_set_icon(GTK_WINDOW(window),create_pixbuf("/usr/share/icons/mate/48x48/apps/web-browser.png"));

	vbox = gtk_vbox_new(FALSE,0);
	gtk_container_add(GTK_CONTAINER(window),vbox);

	menubar = gtk_menu_bar_new();	//代表整個選單,是一個menu shell
	menutoggle = gtk_menu_new();	//這裡代表一列選單toglle,也是一個menu shell
	menu_tog_toggle = gtk_menu_item_new_with_label("View");
//	menu_tog_toolbar = gtk_menu_item_new_with_label("show Toolbar");
//	menu_tog_statusbar = gtk_menu_item_new_with_label("show Statusbar");

	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 = 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);	//View選單加入 menutoggle menu shell
	gtk_menu_shell_append(GTK_MENU_SHELL(menutoggle),menu_tog_toolbar);	//View選單加入 menutoggle menu shell
	gtk_menu_shell_append(GTK_MENU_SHELL(menutoggle),menu_tog_statusbar);	//View選單加入 menutoggle menu shell
	gtk_menu_shell_append(GTK_MENU_SHELL(menubar),menu_tog_toggle);

	//建立工具欄
	toolbar = gtk_toolbar_new();
	gtk_toolbar_set_style(GTK_TOOLBAR(toolbar),GTK_TOOLBAR_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(GTK_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();
	gtk_box_pack_start(GTK_BOX(vbox),menubar,FALSE,FALSE,1);
	//把工具欄加入盒子容器
	gtk_box_pack_start(GTK_BOX(vbox),toolbar,FALSE,FALSE,0);
	gtk_box_pack_end(GTK_BOX(vbox),statusbar,FALSE,TRUE,1);


	//以下是訊號處理部分
	g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
	g_signal_connect(G_OBJECT(menu_tog_toolbar),"activate",G_CALLBACK(menu_pressed),G_OBJECT(statusbar));
	g_signal_connect(G_OBJECT(menu_tog_statusbar),"activate",G_CALLBACK(menu_pressed),G_OBJECT(statusbar));
	g_signal_connect(G_OBJECT(tool_exit),"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);

	gtk_widget_show_all(window);
	gtk_main();
	return 0;
}

Makefile的內容:

all:demo7

OBJECTS:=gtk.o
TARGET:=demo7
CFLAGS:=$(shell pkg-config --cflags --libs gtk+-2.0)

$(TARGET):$(OBJECTS)
	gcc $^ -o [email protected] $(CFLAGS)
	
clean:
	rm $(OBJECTS) $(TARGET)

相關推薦

GTK程式demo,工具狀態

main.c原始碼:#include <gtk/gtk.h> /* *@Description:從一個圖片檔案獲取資訊得到pixbuf *@param: gchar filename */ GdkPixbuf *create_pixbuf(const g

第八課——菜單、工具狀態

菜單項 create reat mfc pop 鍵盤 ram 格式 快捷 一、菜單 1. 關鍵點 菜單系統設計的規則:菜單項文本的格式、助記符等 符號&:用來指定後面的字符是一個助記符 頂層菜單:可以是一個簡單的菜單命令,也可以是下拉菜單 用菜單編輯器添加和修改菜

flutter佈局-9-appbar導航狀態

示例 github:flutterlayout https://github.com/LiuC520/flutterlayout MaterialApp AppBar: 包含狀態列和導航欄 先看下上圖的具體用法 appBar: AppBar(

【Qt】選單工具狀態、右鍵選單的實現

在QMainWidget基礎上實現選單欄、工具欄、狀態列、右鍵選單。 標頭檔案: #ifndef GWDEMO_H #define GWDEMO_H #include <QMainWindow> #include <QMenu> #include <Q

Android 標題狀態隨ScrollView滑動顏色改變輕鬆實現

01、概述: 在開發過程中,這樣的需求也是常見的,隨著ScrollView 的滑動,標題欄和狀態列背景透明度發生變化。有多中實現方式,在這裡記錄一下自己用到的一種。 02、效果: 03、程式碼實現: public class ZpScrollViewActivity e

在mfc中,如何設定一個隱藏選單工具狀態,最大化、最小化、關閉按鈕的窗體 分類: MFC

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {  if (CFrameWnd::OnCreate(lpCreateStruct) == -1)   return -1;  // 去掉標題欄  /*  i

[RK3399][Android7.1] 除錯筆記 隱藏導航狀態

平臺 核心版本 安卓版本 RK3399 Linux4.4 Android7.1 文章目錄 導航欄與狀態列

【QT】QT從零入門教程(四):選單工具狀態

  選單欄、工具欄、工作列是軟體中常見的元件,本節將會講解如何建立選單欄並生成一級選單、二級選單,如何在工具欄中新增圖示和控制元件,如何在工作列中顯示文字。 標題及圖示 // 標題大小 setWindowTitle("影象處理自編軟體 by

iOS 獲取導航狀態的高度

CGRect rect = [[UIApplicationsharedApplication] statusBarFrame]; 狀態列的高度: float status height =  rec

Android隱藏標題狀態的方法

package com.example.layoutdemo; import android.os.Bundle; import android.view.Window; import android.view.Wi

Qt實現選單工具狀態

1.選單欄 1.設計模式 點選 在這裡輸入 輸入完畢後直接回車即可 同樣子選單也是同樣操作。 如果我們想給選單設定ICON,可以如下操作: 在File下新建一個Open子選單,現在想給Open子選單新增Icon圖示。選中子選單Open,在O

獲取導航狀態的高度

// 狀態列(statusbar) CGRect rectStatus = [[UIApplication sharedApplication] statusBarFrame];

PyQt5教程-07-選單工具狀態

選單與工具欄在GUI開發中可以說是必不可少的一部分。所以在PyQt5教程的這一部分,我們將學會建立選單和工具欄。選單是一組位於選單欄中的命令。工具欄是應用程式中的一些常用命令的按鈕。 Main Window主視窗 在PyQt5中,選單與工具欄只出現在在主

Android Studio下實現隱藏標題狀態的閃屏頁

之前在Eclipse下實現理想的全屏閃屏頁,同樣的程式碼拷貝到AS下仍然可以看見標題欄和狀態列,不知道是不是因為AppCompatActivity的原因。 方案一:在程式碼中動態隱藏標題欄和狀態列,但是失敗了。 方案二: 首先在style.xml裡新建resource

Android 4.0中去掉標題狀態的方法

    <style name="Theme.Holo.NoTitleBar">         <itemname="android:windowFullscreen">false</item>           <itemname="android:windo

Android 4.4 以上實現透明導航狀態 Translucent system bar

第一種方式 第一種方式,需要做下面三步設定 1、在values、values-v19、values-v21的style.xml都設定一個 Translucent System Bar 風格的Theme values/style.xml <style name="ImageTranslucentThem

PyQt5學習記錄(2)---QMainWindow選單狀態工具

QMainWindow是繼承自QWidget,提供一個應用程式的主視窗。通過QMainWindow你可以新增自己的QToolBars、QDockWidgets、QMenuBar、QStatusBar等。見下圖: 所以如果我們寫程式的話,主視窗一般都是繼承QMainWind

iOS 獲取導航狀態的高度

bsp statusbar pan frame bar gin cgrect tom uia CGRect rect = [[UIApplication sharedApplication] statusBarFrame]; 狀態欄的高度: float status

極簡操作無需root隱藏S8導航狀態

運行 .html 驅動 root 選項 狀態欄 方法 多人 imm 距離三星Galaxy S8國行發布快一個禮拜了,相信論壇不少小同伴已經拿到手,許多人和我一樣被那塊全視曲面屏給誘惑剁手的,當拿到手把玩一段時間後卻發現這麽美的一塊屏幕居然大部分應用上下都有一行礙眼的狀態欄和

js開啟新視窗,開啟新視窗遮蔽工具位址,視窗按規定大小顯示

opener=null; window.open ("http://baidu.com", "newwindow", "height=500, width=800, toolbar=no, menubar=no, scrollbars=no, resizab