linux gtk IDE 程式設計(二)
flyli
今天早上7點中在睡夢中的我就收到了珠珠(我女朋友哈,是我第一個喜歡的女朋友,今年一起去北京比賽後,她回了家,我回到了學校,呵呵,程式員要想找個好老婆不容易阿,要珍惜才是,您說是不?)的簡訊,說今天他去寺廟抽籤,抽的是因緣簽,沒好意思讓人給解簽,結果就把簽發過來,讓我在網上解。
一查,哇靠,上上籤啊~呵呵
上面說
君垂思澤潤無邊,覆禱祈禳沒黨偏;
一切有情皆受用,均占樂利得周全。
看了看網上的解簽,覺得很簡陋,自己也學過文言文的嘛,所以自己也可以解一點,不過發覺古人真的是很狡猾阿,這種簽貌似可以有很多中解法,然後再看著別個的臉色,基本就能解出比較真實的簽了。。。
不過怎麼說也是個上上籤,因為珠珠有點迷信的哈,所以抽了這種上上籤應該是很有促進作用的哈
不過樂規樂,學習還是要繼續的,要不以後沒錢養老婆讓老婆跟著受罪,那可是男人的恥辱阿。。。
今天對這個IDE中比較重要的部分,代碼框進行了編寫,我用的是gtk的text_view組件,一個好的編寫框肯定是需要周圍有捲軸的,要不這麼小的一個文字框肯定是不夠進行代碼書寫的了,text_view本生已經具有基本的文本編輯功能,但是當書寫文本超過本生的大小的時候,其自己會自動的進行放大,但是它無限制的放大,會導致真箇IDE介面的破壞,於是我們必須加個東東對其進行約束,也就是加上所謂的捲軸
在寫這段代碼之前,我覺得捲軸應該是text_view的一個屬性,假如設定了就會有,但是在實際的查閱資料中發現,其實是把text_view放到了一個捲軸容器裡,這樣當text_view放大的時候,捲軸容器就會對根據text_view的大小進行設定,我覺得這個是個很巧妙的方法,呵呵,gtk很聰明啊,呵呵
這個捲軸容器用的是gtkscrolledwindow查閱其mannal可以得到他的所有使用方法,我在這裡對最簡單的使用方法進行舉例說明
建立當然是最初需要做得哈
view_scroll = gtk_scrolled_window_new(NULL,NULL);
然後進行設定
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(view_scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
這樣的設定可以是捲軸進行自動的調整,當然也有別的選擇哈,詳細的請看mannal
然後將text_view組件放到這個設定好的容器裡就可以了
gtk_container_add (GTK_CONTAINER (view_scroll), view)
最後把view_scroll放到想讓他顯示的地方顯示出來就就可以了哈,很簡單的
以下是我目前的所有代碼,本來我是習慣用工程編譯的,但是在linux下我還不知道怎麼進行多檔案編譯,慚愧阿,還需要繼續學習哦~
#include <gtk/gtk.h>
/*=============================*/
/*definition space */
/*=============================*/
#define MAIN_WINDOW_WIDTH 790
#define MAIN_WINDOW_HIGH 590
/*=============================*/
/*the place of fuction declear */
/*=============================*/
gint delete_event(GtkWidget* widget, GdkEvent* event, gpointer data);
void init_show(void);
/*==============================*/
/*global symbol declear */
/*==============================*/
GtkWidget* main_window;
GtkWidget* window;
GtkWidget* main_menu;
GtkWidget* main_menu_bar;
GtkWidget* main_file_item;
GtkWidget* view;
GtkWidget* table;
GtkWidget* view_scroll;
GtkWidget* main_menu_box;
GtkWidget* project_box;
GtkWidget* debug_box;
GtkWidget* view_box;
GtkWidget* default_box;
GtkWidget* menu_items;
GtkWidget* tmp1;
GtkWidget* tmp2;
GtkWidget* tmp3;
GtkWidget* tmp4;
int main(int argc, char* argv[])
{
/*init*/
gtk_init(&argc,&argv);
/*create the MainWindow*/
main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
main_menu = gtk_menu_new();
view_scroll = gtk_scrolled_window_new(NULL,NULL);
tmp1 = gtk_button_new_with_label("project_space");
tmp2 = gtk_button_new_with_label("debug_space");
tmp3 = gtk_button_new_with_label("default_space");
tmp4 = gtk_button_new_with_label("view_space");
main_menu_box = gtk_hbox_new(FALSE,0);
project_box = gtk_hbox_new(FALSE,0);
debug_box = gtk_hbox_new(FALSE,0);
view_box = gtk_hbox_new(FALSE,0);
default_box = gtk_hbox_new(FALSE,0);
view = gtk_text_view_new();
/*set attribute*/
gtk_window_set_title(GTK_WINDOW(main_window),"flyli");
gtk_window_set_default_size(GTK_WINDOW(main_window),MAIN_WINDOW_WIDTH,MAIN_WINDOW_HIGH);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(view_scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
/*set menu*/
main_file_item = gtk_menu_item_new_with_label("file");
gtk_widget_show(main_file_item);
menu_items = gtk_menu_item_new_with_label("open");
gtk_menu_shell_append(GTK_MENU_SHELL(main_menu),menu_items);
gtk_widget_show (menu_items);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(main_file_item),main_menu);
main_menu_bar = gtk_menu_bar_new();
gtk_menu_shell_append(GTK_MENU_SHELL(main_menu_bar),main_file_item);
gtk_widget_show(main_menu_bar);
/*signal connect*/
g_signal_connect (G_OBJECT (main_window), "delete_event", G_CALLBACK (delete_event), "main_window");
/*display set*/
table = gtk_table_new(100, 100 , TRUE);
gtk_container_add(GTK_CONTAINER(main_window), table);
gtk_table_attach_defaults(GTK_TABLE(table), main_menu_box, 0,100, 0, 5);
gtk_table_attach_defaults(GTK_TABLE(table), project_box, 0,15, 5, 100);
gtk_table_attach_defaults(GTK_TABLE(table), debug_box , 0,100, 85, 100);
gtk_table_attach_defaults(GTK_TABLE(table), default_box, 85,100,5,85);
gtk_table_attach_defaults(GTK_TABLE(table), view_scroll , 15,85,5,85);
gtk_container_add (GTK_CONTAINER (view_scroll), view);
gtk_box_pack_start(GTK_BOX(project_box), tmp1, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(debug_box) , tmp2, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(default_box), tmp3, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(main_menu_box),main_menu_bar,TRUE, TRUE, 0);
/*show*/
init_show();
gtk_main();
return 0;
}
/*=================================*/
/*a common function to answer the */
/*window_main */
/*=================================*/
gint delete_event(GtkWidget* widget, GdkEvent* event, gpointer data)
{
if(data = "main_window")
{
g_print("main_window send quit!/n");
}
gtk_main_quit();
//gtk_widget_destroy(widget);
return FALSE;
}
void init_show(void)
{
gtk_widget_show(main_window);
gtk_widget_show(table);
gtk_widget_show(main_menu_box);
gtk_widget_show(project_box);
gtk_widget_show(debug_box);
gtk_widget_show(view_box);
gtk_widget_show(default_box);
gtk_widget_show(tmp1);
gtk_widget_show(tmp2);
gtk_widget_show(tmp3);
gtk_widget_show(tmp4);
gtk_widget_show(view);
gtk_widget_show(view_scroll);
gtk_widget_show(view);
}
高手看了上面的代碼肯定是充滿鄙視的,其實我也知道,全是全域變數,明顯的不對哈
而且代碼的模組話做得也不好,不過我現在是最初接觸gtk編程,我還沒有摸清怎樣的模組化會比較清晰,還有就是那些變數需要全域,那些需要局部,以及檔案間的私人變數的書寫,還有命名規範等,都還沒有摸索清楚,不過相信我,我會摸索的很快的呵呵,不要鄙視我哈
下一步需要做的就是學會gcc的多檔案編譯,和linux的檔案操作方法了,多檔案編譯好像牽扯到makefile等等的東西,我都不是很懂,所以需要查閱很多的資料,哎~
有點感覺路遙遙其修遠兮的感覺
不過想想珠珠來提提神,感覺不錯哈
以下是運行後的介面哈