程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> GTK+學習:不僅僅是Hello world!

GTK+學習:不僅僅是Hello world!

編輯:關於C語言

一般在學習一項新技術的時候,我最希望看到的不是那一本本厚厚的理論書籍或者編程技巧,即便沒有什麼技巧,我希望的是能夠看到我的成果,即便只是一個小小的什麼都不能做的窗口,也能滿足一下我的好奇心。所以,現在我們先來寫一個小程序,看看GTK+程序是怎樣編寫的。   由於上次我們已經配置好了編譯環境,所以,直接打開你所喜愛的IDE或者記事本,敲下如下的代碼。這裡我是在Windows平台下使用VS2005編譯的,有些術語在其他平台下可能會有出入,但整體是類似的。   #include <gtk/gtk.h>

int main(int argc, char** argv)
{
  GtkWidget* window;
  gtk_init(&argc, &argv);
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_widget_show(window);
  gtk_main();
  return 0;
}   然後進行編譯連接,運行之後,如果沒有錯誤的話,將會出現一個小窗口。嗯,這就是我們用GTK+編寫的界面了。   下面來看看這段程序。首先第一行,是引用的頭文件,一般來說只要引用這個gtk.h就可以了。按照前面所述的方法引入include文件的話,就是在gtk目錄下的gtk.h了。   然後是main函數定義,和C語言一模一樣。   main函數中,第一句聲明一個GtkWidget的指針。前面說過,GTK+是按照面向對象思想設計的,不妨把這個GtkWidget當作類吧,雖然C編譯器並不這麼認為。然後是gtk_init調用,這是初始化GTK+環境。寫過OpenGL程序的朋友應該比較清楚,OpenGL裡面也有一個類似的init函數。然後對前面聲明的指針賦值。看看這個函數名字:gtk_window_new,很清楚是新建一個window指針。按照面向對象的寫法就是:         GtkWidget* window = new GtkWindow(GTK_WINDOW_TOPLEVEL);   怎麼樣?清楚很多了吧?其實這裡就已經暗示出了,GtkWindow繼承了GtkWidget類。這些在後面就會看出,GtkWidget其實是所有控件的父類。傳遞的參數是GTK_WINDOW_TOPLEVEL,指明是一個頂層的窗口。然後使用gtk_widget_show設置顯示,同樣把它想象成面向對象的語法就是:         window -> show();   最後一句gtk_main,將我們的程序帶入GTK+的事件監聽循環。   這樣,我們的程序就介紹完了。但是也許就會發現一個問題:怎麼後面還有一個黑黑的控制台窗口啊?這是因為默認運行方式是Debug,換成Release看看?那個丑丑的窗口沒有了吧?而且生成的二進制文件也比那個小了很多。   嗯,當我們按下關閉按鈕時,窗口是不見了,但是程序並沒有退出啊?對哦,因為我們沒有添加事件監聽啊,所以當關閉窗口的時候,GTK+也不知道該怎麼做。所以,我們繼續修改代碼如下:   #include <gtk/gtk.h>

int main(int argc, char** argv)
{
  GtkWidget* window;
  gtk_init(&argc, &argv);
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  g_signal_connect(GTK_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
  gtk_widget_show(window);
  gtk_main();
  return 0;
}   注意,我們添加了一個事件監聽函數: g_signal_connect(GTK_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);   它的意思是,對於對象window,當"destroy"時間發生時,調用gtk_main_quit函數,傳給這個函數的參數是NULL。如果我們使用Java語言的事件監聽寫法,就是這樣子的: window.addDestroyListener(new CallbackFunc(){     gtk_main_quit(); });   不過這段代碼應該也是比較容易讀懂的。其實這就是GTK+中添加事件監聽的寫法,每個控件的每個事件監聽都是這樣編寫代碼,很統一。修改完成後運行一下,點下關閉按鈕:哈,程序退出了!   那麼,我們再來修改一下程序吧:   #include <gtk/gtk.h>

int main(int argc, char** argv)
{
  GtkWidget* window;
  gtk_init(&argc, &argv);
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "Hello world!");
  g_signal_connect(GTK_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
  gtk_widget_show(window);
  gtk_main();
  return 0;
}   運行一下看看?窗口標題已經換成了經典的Hello world!了。   讀一下代碼,我們添加了這麼一句: gtk_window_set_title(GTK_WINDOW(window), "Hello world!");   如果你能想到它的面向對象語法,就達到目的了啊: ((GtkWindow*)window) -> setTitle("Hello world!");   注意,因為C編譯器是不理解面向對象的多態機制的,所以,GTK+使用了很多宏來進行類型轉換,比如這裡的GTK_WINDOW。還記得我們聲明的是GtkWidget指針,需要轉換成GtkWindow指針才能使用set_title函數的。同時,這個宏也有類型檢測的功能,如果不能轉換,是會拋出異常的。   好了,現在經過一步步的代碼添加,我們已經了解了GTK+程序的編寫過程,並且能夠創建一個窗體,添加事件監聽和修改控件屬性——GUI編程的主體不就是這些嗎?剩下的就是一些細節,和對於龐大的控件庫的學習了。

本文出自 “豆子空間” 博客,請務必保留此出處http://devbean.blog.51cto.com/448512/108758

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved