(1)GladeによるGUI作成
"Propertiesウインドウ"に並んだアイコンの左上のウインドウのアイコンをえらぶと空のウインドウが表示される。さらに”Aのアイコンを選んで
ウインドウをクリックする。するとウインドウの真中にLabel1という文字が表示されるはずだ。
この状態"Propeteisウインドウ"にはLabel1のプロパティが表示されているはずだ。Labelの欄のlabel1をHellow
World !!に書き換えよう。ウインドウに表示されてる文字もHellow World !!になったはずだ。
ウインドウを右クリックして"Windo1 /
Selsect"を選ぶと"Propeteisウインドウ"の表示がWindow1に切り替わる。ここでもLabelをHellow World
!!に書き換えよう。右クリックして"Windo1 / Selsect /
Redisplay"を選ぶとプログラム実行時表示される大きさのウインドウになる。
これでウインドウの見た目は完成だが最低限捕まえておかないといけないイベントがあるのでこれを用意する。まず"Propeteisウインドウ"に
window1を表示させ"Signals"タブを選ぶ。次にSingnalのところで"GtkObject
Signal"のdestoryを選ぶ。アッドボタンを押せばシグナルハンドラの準備完了だ。さらに同様にして"GtkWidget
Signal"のdestroyシグナルに対するシグナルハンドラも用意する
最後に"Project /
Option"の"General"タブでProjectDirectoryにセーブするディレクトりを書き込んでOKボタンをおす。"Project
/ Save" "Project
/ build"とやってソースを生成すればGladeの準備終了だ。
(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はオブジェクト指向にもとづいて実装されている。これは"親->子供の巨大
な家系図"があって子供は親の性質を受け継いでいるということだ。すなわち子供を親の型に型変換できるが逆は出来ないわけだ。もちろんおじさんや
おばさんにも型変換できない。 |
このHPの内容について問題があればsけいしまでご連絡願います。
sけいし(s_keishi@yahoo.co.jp)
DevCPPの使い方に戻る
sけいし発HPに戻る