「OSS開発ツール/GUIツールキット」の版間の差分
削除された内容 追加された内容
M .旻 がページ「OSS開発ツール GUIツールキット」を「OSS開発ツール/GUIツールキット」に移動しました |
+cat |
||
1 行
==Gtk+==
6 ⟶ 5行目:
ここでは、最初にglibについて述べ、その後にglibを使ったGUIについて述べます。
===GTK+のオブジェクト指向===
16 ⟶ 14行目:
例えば、IDと名前を持ったmemberというオブジェクトを考えるなら、(IDに対するsetとgetも付け加えることにします)
<source lang=c>
char * name;
int getID(struct member *); void setID(struct member *, int);
</source>
とすることで、memberの振舞いを記述できます。
27 行
この振舞いを付け加えるには、Cのキャストを利用します。まず、employeeを、
<source lang=c>
struct member parent;
void work(employee *);
</source>
として定義します。parentとしてstruct memberを取っているところが重要です。
あるemployeeであるemployee1を定義して、そのIDを表示したいとしましょう。この場合には、
<source lang=c>
printf("%d",((struct member *)&employee1)->getID()); </source>
とすることで、employee1のIDを取得できます。
62 ⟶ 66行目:
実際の定義では更にいくつかの慣用的記法を利用しますが、これ以上の詳細はglibのリファレンスを参照して下さい。実際にaaaの定義をするには、かなり多くのコードを書く必要があります。
static GType type = 0;▼
if (type == 0) {▼
static GTypeInfo info ={▼
sizeof(aaa_class),0,0,▼
aaa_class_init,0,0,▼
sizeof(aaa),0,▼
aaa_init▼
return type;▼
</source>
▲ /* aaa.c */
▲ #include <glib.h>
▲ #include <glib-object.h>
▲ #include <aaa.h>
▲ GType aaa_get_type () {
▲ static GType type = 0;
▲ if (type == 0) {
▲ static GTypeInfo info ={
▲ sizeof(aaa_class),0,0,
▲ aaa_class_init,0,0,
▲ sizeof(aaa),0,
▲ aaa_init
▲ }
▲ type = g_type_register_static (G_TYPE_OBJECT, "aaa", &info, 0);
▲ return type;
▲ }
▲ aaa_init(), aaa_class_init() の定義 ... 。
上の例は非常に長くなるようですが、実際にはaaa_get_type() やマクロの定義は全てのglibオブジェクトで共通なので、他の例からコピーすればよいでしょう。
112 ⟶ 117行目:
クラス定義以外の、実際のプログラム中では、C++でいうnew演算子でaaaのインスタンスを作成します。new演算子の機能はこれらの定義を与えた後で、g_object_new() 関数によって提供されます。例えば、aaaのインスタンスを作成したいときには、
<source lang=c>
</source>
によってaaa_initで値が初期化されたインスタンスを得ることが出来ます。aaa1からメンバ関数を利用するには
AAA_GET_CLASS(aaa1)-> work(aaa1);
160 ⟶ 167行目:
GtkWindowを作り、GtkDrawingAreaを収納するサンプルは次のようになります。まず最初にGTKライブラリの初期化とウィジェットポインタの宣言を行います。
<source lang=c>
int main(int
GtkWidget *win, *da;
/* ここで、win, daはそれぞれGtkWindowとGtkDrawingAreaに対応します。GtkWindowとGtkDrawingAreaを実際に作るには、次のようにします。*/
/* これらの関数は対応する構造体のnew関数です。*/
更に、GtkWindow*winにGtkDrawingArea*daを収納します。このためには、gtk_container_addを使います。▼
gtk_container_add(GTK_CONTAINER(win), da); ▼
ここで、winに対してGtkContainer*へのキャストが行われていることに注意してください。GtkWindowはGtkContainerを継承するので、この操作は正しい操作です。しかし、GtkContainerを継承しない"クラス"に対してこの操作を行うと、プログラムの実行時に警告が出されます。▼
▲ /* 更に、GtkWindow*winにGtkDrawingArea*daを収納します。このためには、gtk_container_addを使います。*/
次に、実際に描画関数を呼ぶ処理を行います。ここで、実際の描画はコールバック関数の中で行います。コールバック関数の名称はexpose_cbとします。コールバック関数を登録するために、▼
g_signal_connect(da, "expose_event", G_CALLBACK(expose_cb), NULL);▼
▲ /* ここで、winに対してGtkContainer*へのキャストが行われていることに注意してください。GtkWindowはGtkContainerを継承するので、この操作は正しい操作です。しかし、GtkContainerを継承しない"クラス"に対してこの操作を行うと、プログラムの実行時に警告が出されます。*/
▲ /* 次に、実際に描画関数を呼ぶ処理を行います。ここで、実際の描画はコールバック関数の中で行います。コールバック関数の名称はexpose_cbとします。コールバック関数を登録するために、*/
▲
</source>
この関数の名前はg, signal, connectの3つに分かれます。
449 ⟶ 456行目:
==参考としたプログラム==
GNOME
[[Category:OSS開発ツール|GUIつるきつと]]
|