「OSS開発ツール/GUIツールキット」の版間の差分

削除された内容 追加された内容
.旻 (トーク | 投稿記録)
M .旻 がページ「OSS開発ツール GUIツールキット」を「OSS開発ツール/GUIツールキット」に移動しました
.旻 (トーク | 投稿記録)
+cat
1 行
 
<small>[[OSS開発ツール]]>OSS開発ツール GUIツールキット</small>
----
==Gtk+==
 
6 ⟶ 5行目:
 
ここでは、最初にglibについて述べ、その後にglibを使ったGUIについて述べます。
 
 
===GTK+のオブジェクト指向===
16 ⟶ 14行目:
 
例えば、IDと名前を持ったmemberというオブジェクトを考えるなら、(IDに対するsetとgetも付け加えることにします)
<source lang=c>
struct member {
int id;
char *int nameid;
char * name;
int getID(struct member *);
void setID(struct member *, int);
}
</source>
とすることで、memberの振舞いを記述できます。
 
27 行
 
この振舞いを付け加えるには、Cのキャストを利用します。まず、employeeを、
<source lang=c>
struct employee {
struct memberemployee parent;{
struct member parent;
double wage;
void work(employeedouble *)wage;
void work(employee *);
}
</source>
として定義します。parentとしてstruct memberを取っているところが重要です。
 
あるemployeeであるemployee1を定義して、そのIDを表示したいとしましょう。この場合には、
<source lang=c>
struct employee employee1;
struct employee employee1;
printf("%d",((struct member *)&employee1)->getID());
</source>
とすることで、employee1のIDを取得できます。
 
62 ⟶ 66行目:
 
実際の定義では更にいくつかの慣用的記法を利用しますが、これ以上の詳細はglibのリファレンスを参照して下さい。実際にaaaの定義をするには、かなり多くのコードを書く必要があります。
/* aaa.h */
#define TYPE_AAA (aaa_get_type())
#define AAA(self) ((aaa*) self)
#define AAA_CLASS(self) ((aaa_class*) self)
#define AAA_GET_CLASS(self) (G_TYPE_INSTANCE_GET_CLASS((self),TYPE_AAA, aaa_class))
typedef struct _aaa aaa;
typedef struct _aaa_class aaa_class;
struct _aaa{
GObject parent;
/* フィールド */
};
struct _aaa_class {
GObjectClass parent;
/* オブジェクト間で共有される関数など */
};
void aaa_init (GTypeInstance *self, gpointer data);
void aaa_class_init (gpointer *self, gpointer data);
GType aaa_get_type ();
 
/* 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() の定義 ... 。*/
</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>
aaa * aaa1 = g_object_new(TYPE_AAA, 0);
</source>
によってaaa_initで値が初期化されたインスタンスを得ることが出来ます。aaa1からメンバ関数を利用するには
AAA_GET_CLASS(aaa1)-> work(aaa1);
160 ⟶ 167行目:
 
GtkWindowを作り、GtkDrawingAreaを収納するサンプルは次のようになります。まず最初にGTKライブラリの初期化とウィジェットポインタの宣言を行います。
<source lang=c>
#include <gtk/gtk.h>
int main(int argc, char **argv){
int main(int gtk_init(&argc, &char **argv); {
GtkWidget *wingtk_init(&argc, *da&argv);
GtkWidget *win, *da;
/* ここで、win, daはそれぞれGtkWindowとGtkDrawingAreaに対応します。GtkWindowとGtkDrawingAreaを実際に作るには、次のようにします。*/
win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
da = gtk_drawing_area_new();
/* これらの関数は対応する構造体の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とします。コールバック関数を登録するために、
gtk_container_add(GTK_CONTAINER(win), da);
g_signal_connect(da, "expose_event", G_CALLBACK(expose_cb), NULL);
/* ここで、winに対してGtkContainer*へのキャストが行われていることに注意してください。GtkWindowはGtkContainerを継承するので、この操作は正しい操作です。しかし、GtkContainerを継承しない"クラス"に対してこの操作を行うと、プログラムの実行時に警告が出されます。*/
を使います。ここでは、関数g_signal_connectについて解説します。
 
/* 次に、実際に描画関数を呼ぶ処理を行います。ここで、実際の描画はコールバック関数の中で行います。コールバック関数の名称はexpose_cbとします。コールバック関数を登録するために、*/
g_signal_connect(da, "expose_event", G_CALLBACK(expose_cb), NULL); // を使います。ここでは、関数g_signal_connectについて解説します。
</source>
この関数の名前はg, signal, connectの3つに分かれます。
 
449 ⟶ 456行目:
==参考としたプログラム==
GNOME
*http://gnome.org
[[Category:OSS開発ツール|GUIつるきつと]]