やっぱり Hello World から

(1)GladeによるGUI作成
"Propertiesウインドウ"に並んだアイコンの左上のウインドウのアイコンをえらぶと空のウインドウが表示される。さらに”Aのアイコンを選んで ウインドウをクリックする。するとウインドウの真中にLabel1という文字が表示されるはずだ。
gtk2 glade 1
この状態"Propeteisウインドウ"にはLabel1のプロパティが表示されているはずだ。Labelの欄のlabel1をHellow World !!に書き換えよう。ウインドウに表示されてる文字もHellow World !!になったはずだ。
gtk2 glade 2
ウインドウを右クリックして"Windo1 / Selsect"を選ぶと"Propeteisウインドウ"の表示がWindow1に切り替わる。ここでもLabelをHellow World !!に書き換えよう。右クリックして"Windo1 / Selsect / Redisplay"を選ぶとプログラム実行時表示される大きさのウインドウになる。
 

これでウインドウの見た目は完成だが最低限捕まえておかないといけないイベントがあるのでこれを用意する。まず"Propeteisウインドウ"に window1を表示させ"Signals"タブを選ぶ。次にSingnalのところで"GtkObject Signal"のdestoryを選ぶ。アッドボタンを押せばシグナルハンドラの準備完了だ。さらに同様にして"GtkWidget Signal"のdestroyシグナルに対するシグナルハンドラも用意する
gtk2 glade 3
最後に"Project / Option"の"General"タブでProjectDirectoryにセーブするディレクトりを書き込んでOKボタンをおす。"Project  / Save" "Project / build"とやってソースを生成すればGladeの準備終了だ。
gtk2 glade 4

(2)DevC++によるプログラム作成

2−1)GUIのチェック

devcpp projectも生成されてるので devcpp\hellow_w.devをdevcppに読み込ませる。

ここで"実行 / コンパイル&実行"を選べばGUIが表示される。

(インクルードエラーになる場合は、環境変数 GTK_BASEPATHを確認しよう)

2−2)シグナルハンドラの実装 

あとは callbacks.c にシグナルハンドラを書けばプログラムは完成だ。

"interface.c"の42行目から47行目までがシグナルハンドラの設定だ。
----(interface.c)----
  gtk_signal_connect ((gpointer) window1, "destroy",
                    G_CALLBACK (on_window1_destroy),
                    NULL);
  gtk_signal_connect ((gpointer) window1, "delete_event",
                    G_CALLBACK (on_window1_delete_event),
                    NULL);
----   ----
この内容からon_window1_destoryとon_window1_delete_eventという2つのコールバック関数を書けばいいことがわ かる。
この2つのコールバック関数はcallbacks.hとcallbacks.cで用意されてる。
----(callbacks.h)----
#include <gtk/gtk.h>
 

void
on_window1_destroy                     (GtkObject       *object,
                                        gpointer         user_data);

gboolean
on_window1_delete_event                (GtkWidget       *widget,
                                        GdkEvent        *event,

---- ----
----(callbacks.c)----
#ifdef HAVE_CONFIG_H
#  include <config.h>
#endif

#include <gtk/gtk.h>

#include "callbacks.h"
#include "interface.h"
#include "support.h"
 

void
on_window1_destroy                     (GtkObject       *object,
                                        gpointer         user_data)
{
gtk_main_quit();
}
 

gboolean
on_window1_delete_event                (GtkWidget       *widget,
                                        GdkEvent        *event,
                                        gpointer         user_data)
{

  return FALSE;
}
----  -----
僕が実際に書いたのは on_window1_destroyのgtk_main_quit();だけだ。

xボタンが押されると on_window1_delete_event が呼ばれるこの返り値がFALSEだとon_window1_destroy がよばれgtk_main_quit(); によりgtk_main()が終了する。
on_window1_delete_eventにTRUEを返すとウインドウが破壊されない。これは一旦ダイアログなどで終了するかどうか聞いた結果終 了しない場合に使える。
 
 
(不定期コラム)オブジェクト指向と型変換

プログラム中にGTK_OBJECT()とかあるが、いったいこれは何をするマクロなのか?

GTK2はオブジェクト指向にもとづいて実装されている。これは"親->子供の巨大 な家系図"があって子供は親の性質を受け継いでいるということだ。すなわち子供を親の型に型変換できるが逆は出来ないわけだ。もちろんおじさんや おばさんにも型変換できない。
C言語の型変換は通常(GtkObject*) compnentのよう書く。しかし、この方法だと遠い親戚や子孫に型変換する危険性がある。巨大な家系図を全部覚えていればミスしないだろうがそんなの は無理だ。
そこで、GTK_OBJECT (component)と書いてやれば実行時に不正な型変換をチェックしてくれる。
代表的な型変換マクロには以下のような物がある。もちろん他にもある。
GTK_WIDGET()
GTK_OBJECT()
GTK_CONTAINER()
GTI_WINDOW()
GTK_BOX()
家系図を見つつヘッダを見つつ使用する型変換を決めていくしかない。



このHPの内容について問題があればsけいしまでご連絡願います。
sけいし(s_keishi@yahoo.co.jp)
DevCPPの使い方に戻る
sけいし発HPに戻る
inserted by FC2 system