GTK+浅談のまとめ

6875 ワード

一、紹介
GTK+のいくつかの知識点をまとめて、後で調べるのに便利です.
二、詳しく
1、G_BEGIN_DECLSとG_END_DECLSマクロ
#ifdef  __cplusplus
# define G_BEGIN_DECLS  extern "C" {
# define G_END_DECLS    }
#else
# define G_BEGIN_DECLS
# define G_END_DECLS
#endif

CコードとC++コードを互いに互換性を保つためのプロセス呼び出しインタフェース.
2.GLibのライブラリ
GLibは、GDKおよびGTKアプリケーションを作成する際に使用できる多くの有用な定義および関数を提供する最下位のライブラリです.このライブラリには、基本タイプおよび制限の定義、標準マクロ、タイプ変換、バイト順、ストレージ割り当て、警告および断言、メッセージ記録、タイマ、文字列ツール、hook関数、構文スキャナ、ダイナミックロードモジュールと文字列は自動的に補完されます.ストレージブロック、双方向チェーンテーブル、一方向チェーンテーブル、ハッシュテーブル、ダイナミックリスト、リレーションシップ、メタグループ、キャッシュなど、多くのデータ型および関連操作も提供されます.最後にGLibは移植性に優れているため、GLibを下位アプリケーションとしてサポートすることで、アプリケーションの移植性も保証される.(1)双方向チェーンテーブル
GList *g_list_append(GList *list, gpointer data):            
GList *g_list_prepend(GList *list, gpointer data):            
GList *g_list_insert(GList *list, gpointer data, gint position):               
GList *g_list_remove(GList *list, gpointer data):           data   ,       ,     
GList *g_list_free(GList *list):    GList        
GList *g_list_remove_link(GList *list, GList *link)
GList *g_list_reverse(GList *list):        
GList *g_list_nth(GList *list, gint n):        
GList *g_list_find(GList *list, gpointer data):                ,     NULL
GList *g_list_last(GList *list):           
GList *g_list_first(GList *list):          
gint g_list_length(GList *list):        
void g_list_foreach(GList *list, GFunc func, gpointer data):    
gint g_list_index(GList *list, gconstpointer data):             ,         ,   -1。     0    。
例:
void each_callback(gpointer data, gpointer user_data)
{
	g_print("element:%s, user param:%s
", (gchar*)data, (gchar*)user_data); } int main( int argc, char *argv[] ) { GList *list = NULL; list = g_list_append(list, "second"); list = g_list_prepend(list, "first"); g_list_foreach(list, each_callback, "user_data"); GList *second = g_list_find(list, "second"); g_print("findElement:%s
", (gchar*)second->data); list = g_list_remove(list, "second"); g_list_foreach(list, each_callback, "user_data"); return 0; }
(2)一方向チェーンテーブル
GSList *g_slist_append(GSList *list, gpointer data):          
GSList *g_slist_prepend(GSList *list, gpointer data):           
GSList *g_slist_insert(GSList *list, gpointer data, gint position):           
GSList *g_slist_remove(GSList *list, gpointer data):        data   
GSList *g_slist_reverse(GSList *list):      
GSList *g_slist_nth(GSList *list, gint n):          
GSList *g_slist_find(GSList *list, gpointer data):    data   ,     NULL
GSList *g_slist_last(GSList *list):           
gint g_slist_length(GSList *list):        
void g_slist_foreach(GSList *list, GFunc func, gpointer data):    

(3)ストレージ管理
gpointer g_malloc(gulong size):  malloc     ,        。             ,       。
gpointer g_malloc0(gulong size): g_malloc      ,               ,      0。
gpointer g_realloc(gpointer mem, gulong size):     mem     ,      size  。
void g_free(gpointer mem):        。  mem NULL,     。

(4)タイマー
GTimer *g_timer_new(void):        
void g_timer_destroy(GTimer *timer):     
void g_timer_start(GTimer *timer):     
void g_timer_stop(GTimer *timer):    
void g_timer_reset(GTimer *timer):     
void g_timer_continue(GTimer *timer):    
gdobule g_timer_elapsed(GTimer *timer, gulong *microseconds):      

例:
GTimer *timer;
void each_callback(gpointer data, gpointer user_data)
{
	g_print("element:%s, user param:%s
", (gchar*)data, (gchar*)user_data); } int main( int argc, char *argv[] ) { GList *list = NULL; gulong seconds; int i=0; timer = g_timer_new(); list = g_list_append(list, "second"); list = g_list_prepend(list, "first"); g_timer_start(timer); g_list_foreach(list, each_callback, "user_data"); g_timer_stop(timer); g_timer_elapsed(timer, &seconds); g_print("use seconds:%ld
", seconds); g_timer_continue(timer); for(i; i<=1000; i++) { g_print("%d", i); } g_timer_elapsed(timer, &seconds); g_print("use seconds:%ld
", seconds); return 0; }

(5)文字列処理
GLibはGStringという新しいタイプを定義し,自動的に成長し,一連の便利な操作関数を提供する.
struct GString{
gchar *str;/*現在0で終わる文字列を指す*/
gint len;/*現在の文字長*/
}
GString *g_string_new(gchar *init):  GList  
GString *g_string_truncate(GString *string, gint len):          
GString *g_string_append(GString *string, gchar *val):       
GString *g_string_append_c(GString *string, gchar c):        
GString *g_string_prepend(GString *string, gchar *val):       
GString *g_string_prepend_c(GString *string, gchar c):        
void g_string_sprintf(GString *string, gchar *fmt, ...):      
gchar *g_strdup (const gchar *str):     ,           。
gchar *g_strndup(const gchar *str, gsize n):          ,         
gchar *g_strstr_len(const gchar *haystack, gssize haystack_len, const gchar *needle):      ,            
gchar *g_strrstr(const gchar *haystrack, const gchar *needle):     haystack          。
gchar *g_strrstr_len(const gchar *haystrack, gssize haystrack_len, const gchar *needle)
gboolean g_str_hash_prefix(const gchar *str, const gchar *prefix):              
int g_strcmp0(const char *str1, const char *str2):       
gchar **g_strsplit(const gchar *string, const gchar *delimiter, gint max_tokens):     ,     
gchar *g_strconcat(const gchar *string1, ...):     
gchar *g_strjoin(const gchar *separator, ...):           

(6)エラー処理
gchar *g_strdup( const gchar *str ):  strdup  。                  ,        。
gchar *g_strerror( gint errnum );
void g_error( gchar *format, ... );    :“ ** ERROR ** ”      。        。
void g_warning( gchar *format, ... ):    :“ ** WARNING ** ”
void g_message( gchar *format, ... ):         "message"
void g_print( gchar *format, ... ):  printf  

3、gtk-demo
linuxは端末の下にgtk-demoを入力し、名前をダブルクリックするとインスタンスを実行し、ディレクトリ/usr/share/doc/gtk+-devel-1.2.10/examples/に入る例も一部あります.gtk-demoの例を自分で実行するには、次の主関数を加えます.
int main (int argc, char *argv[])  
 {
     /*
    GtkWidget *window = NULL;  
    gtk_init(&argc, &argv);
    window = do_button_box(NULL);

    gtk_widget_show_all(window);   
    gtk_main(); 
    return 0; 
     */
    GtkWidget *do_window = NULL;   
    gtk_init(&argc, &argv);   
    do_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    //add example
    do_window = do_button_box (do_window);

    g_signal_connect(do_window, "destroy",G_CALLBACK (gtk_main_quit), NULL);
    gtk_main();  
    return 0;   
}