用GTK打造一個notebook

 引用自:

http://blog.chinaunix.net/u2/81187/showart_1855688.html

 

學習 GTK 也有一段時間了,但總是深入不下去,究其原因,是因爲沒有實際的處理過問題,沒有完整的去自已實現過編程。

因此就萌發了自已寫一個軟件工具的想法,想來想去,決定從寫一個記事本開始,以後慢慢再開發一些比較複雜的。

首先做好規劃,安排工作進度 , 防止半途而廢 ( 個人的不良習慣,做事有始無終,一定要好好克服 )

第一步是界定功能,也就是列出想要實現的功能,雖然是個人練習,也得有個需求分析。

目前能想到的 feature list 如下:

1. 基本的新建、打開、保存文件;

2. 編輯選項有複製、拷貝功能;

3. 語法高亮,

4. 搜索、替換功能;

第二步是界面搭建 , 由於不像 win 開發 VB VC 那樣有一個 IDE ,決定先用 glade 將界面搭建起來,代碼後實現。其實界面本身也沒有什麼東西,不用畫草圖也可以想得出來如何實現。

主要部件:菜單欄、工具欄、文本區、狀態欄順序搭起來就可以了,不多述了。

第三步 code 實現。對於我來說 ,glade 只是一個參考,界面我還是用代碼 code 出來的。但這個不是重點,重點是如何編寫相應的 callback function, 這纔是實現功能的重點。目前來講,也是遇到問題比較多的地方。

 

以下是我目前的實現代碼,給大家參考。當然,後續還是會再添加,修改,完善的。畢竟目前還只是個半成品:

/*

===============================================================================

*

* Filename: notebook.c

*

* Description: notebook test programe

*

* Version: 1.0

* Revision: none

* Compiler: gcc

*

* Author: Dr.Wp (mn),

* Company: SunLinux

*

* =========================================================================

*/

#include <stdio.h>

#include <stdlib.h>

#include "gtk/gtk.h"

//#include "notebook.h"

//#include "interface.h"

//#include "callbacks.h"

void menu_item_open_file(GtkWidget *widget,gpointer data);

void menu_item_response(GtkWidget *widget,gpointer data);

gint

delete_event(GtkWidget *widget,

GdkEvent *event,

gpointer data)

{

g_print("delete event/n");

return TRUE;

}

void

destroy_event(GtkWidget *widget,

gpointer data)

{

gtk_main_quit();

}

int

main(int argc,

char* argv[])

{

GtkWidget *notebk_win;

GtkWidget *vbox1;

GtkWidget *textArea;

GtkWidget *statusBar;

GtkWidget *menuBar;

GtkWidget *menu;

//GtkWidget *button;

GtkWidget *item;

GtkWidget *openItem,*saveItem,*quitItem;

GtkWidget *copyItem,*pasteItem,*cutItem;

GtkWidget *aboutItem,*helpItem;

GtkWidget *toolbar;

GtkToolItem *new;

GtkToolItem *open;

GtkToolItem *save;

GtkToolItem *sep;

GtkToolItem *exit;

//init window for receive Natuils event

gtk_init(&argc,&argv);

//create notebook main window

notebk_win = gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_window_set_position (GTK_WINDOW(notebk_win), GTK_WIN_POS_CENTER);

gtk_window_set_default_size(GTK_WINDOW(notebk_win),

800,

600);

gtk_window_set_icon_from_file(GTK_WINDOW(notebk_win),"tux.ico",NULL);

g_signal_connect(G_OBJECT(notebk_win),"delete_event",

G_CALLBACK(delete_event),NULL);

g_signal_connect(G_OBJECT(notebk_win),"destroy",

G_CALLBACK(destroy_event),NULL);

//create vbox,and put menubar,textarea,status bar into it;

vbox1 = gtk_vbox_new(FALSE,0);

gtk_container_set_border_width(GTK_CONTAINER(vbox1),0);

//1.create menu for notebook

menuBar = gtk_menu_bar_new();

gtk_box_pack_start(GTK_BOX(vbox1),menuBar,FALSE,FALSE,0);

gtk_widget_show(menuBar);

//1.1 create "File" of menu

menu = gtk_menu_new();

//create image icon item "new"

openItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN,NULL);

gtk_menu_append(GTK_MENU(menu),openItem);

gtk_widget_show(openItem);

//create image icon item "save"

saveItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_SAVE,NULL);

gtk_menu_append(GTK_MENU(menu),saveItem);

gtk_widget_show(saveItem);

//create image icon item "quit"

quitItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT,NULL);

gtk_menu_append(GTK_MENU(menu),quitItem);

gtk_widget_show(quitItem);

//add menu item to menu Bar

item = gtk_menu_item_new_with_label("File");

gtk_widget_show(item);

gtk_menu_item_set_submenu(GTK_MENU_ITEM(item),menu);

gtk_menu_bar_append(GTK_MENU_BAR(menuBar),item);

//callbace for every sub menu item

g_signal_connect_swapped (G_OBJECT (quitItem), "activate",

G_CALLBACK (menu_item_response),

NULL);

g_signal_connect_swapped (G_OBJECT (openItem), "activate",

G_CALLBACK (menu_item_open_file),

NULL);

//1.2 creat "Edit"

menu = gtk_menu_new();

copyItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_COPY,NULL);

gtk_menu_append(GTK_MENU(menu),copyItem);

gtk_widget_show(copyItem);

pasteItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_PASTE,NULL);

gtk_menu_append(GTK_MENU(menu),pasteItem);

gtk_widget_show(cutItem);

cutItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_CUT,NULL);

gtk_menu_append(GTK_MENU(menu),cutItem);

gtk_widget_show(cutItem);

item = gtk_menu_item_new_with_label("Edit");

gtk_widget_show(item);

gtk_menu_item_set_submenu(GTK_MENU_ITEM(item),menu);

gtk_menu_bar_append(GTK_MENU_BAR(menuBar),item);

//1.3 creat "Help"

menu = gtk_menu_new();

aboutItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_HELP,NULL);

gtk_menu_append(GTK_MENU(menu),aboutItem);

gtk_widget_show(aboutItem);

helpItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_ABOUT,NULL);

gtk_menu_append(GTK_MENU(menu),helpItem);

gtk_widget_show(helpItem);

item = gtk_menu_item_new_with_label("Help");

gtk_widget_show(item);

gtk_menu_item_set_submenu(GTK_MENU_ITEM(item),menu);

gtk_menu_bar_append(GTK_MENU_BAR(menuBar),item);

//2.create toolbar

toolbar = gtk_toolbar_new();

gtk_toolbar_set_style(GTK_TOOLBAR(toolbar),GTK_TOOLBAR_ICONS);

gtk_container_set_border_width(GTK_CONTAINER(toolbar),2);

new = gtk_tool_button_new_from_stock(GTK_STOCK_NEW);

gtk_toolbar_insert(GTK_TOOLBAR(toolbar),new,-1);

gtk_widget_show(new);

open = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN);

gtk_toolbar_insert(GTK_TOOLBAR(toolbar),open,-1);

gtk_widget_show(open);

save = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE);

gtk_toolbar_insert(GTK_TOOLBAR(toolbar),save,-1);

gtk_widget_show(save);

sep = gtk_separator_tool_item_new();

gtk_toolbar_insert(GTK_TOOLBAR(toolbar),sep,-1);

gtk_widget_show(sep);

exit = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT);

gtk_toolbar_insert(GTK_TOOLBAR(toolbar),exit,-1);

gtk_widget_show(exit);

//add toolbar to vbox

gtk_box_pack_start(GTK_BOX(vbox1),toolbar,FALSE,FALSE,5);

gtk_widget_show(toolbar);

//3.add text area to box

textArea = gtk_text_view_new();

gtk_box_pack_start(GTK_BOX(vbox1),textArea,TRUE,TRUE,1);

gtk_widget_show(textArea);

GtkTextBuffer *buffer;

buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textArea));

//4.add status bar to box

statusBar = gtk_statusbar_new();

gtk_box_pack_start(GTK_BOX(vbox1),statusBar,FALSE,TRUE,0);

gtk_widget_show(statusBar);

//5.show main frame of notebook

gtk_container_add(GTK_CONTAINER(notebk_win),vbox1);

gtk_widget_show(vbox1);

gtk_widget_show(notebk_win);

gtk_main();

return 0;

}

void menu_item_response(GtkWidget *widget,gpointer data)

{

g_print("button pressed/n");

gtk_main_quit();

}

void menu_item_open_file(GtkWidget *widget,gpointer data)

{

GtkWidget *dialog;

GtkTextBuffer *text_buffer;

GtkTextIter iter;

dialog = gtk_file_chooser_dialog_new("Open file",

widget,

GTK_FILE_CHOOSER_ACTION_OPEN,

GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,

GTK_STOCK_OPEN,GTK_RESPONSE_ACCEPT,

NULL);

//there is not create text tags

text_buffer = gtk_text_buffer_new(NULL);

gtk_text_buffer_get_iter_at_offset(text_buffer,&iter,0);

if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)

{

char *filename;

FILE* fd;

gchar *content;

gsize bytes;

GError *error = NULL;

filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));

if(filename)

{

g_file_get_contents(filename,&content,&bytes,&error);

gtk_text_buffer_set_text(text_buffer,content,-1);

}

g_free(filename);

}

gtk_widget_destroy(dialog);

}

static gint button_pressed(GtkWidget *widget,

GdkEvent *event)

{

if(event->type == GDK_BUTTON_PRESS)

{

GdkEventButton *bevent = (GdkEventButton*)event ;

gtk_menu_popup(GTK_MENU(widget),NULL,NULL,NULL,NULL,

bevent->button,bevent->time);

return TRUE;

}

return FALSE;

}

目前遇到的問題是如何打開一個文件,在gtk_text_view中顯示它,這是下一步要做的工作。

發佈了18 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章