FreeBASIC マニュアルのトップに戻る

FreeBASIC GTK 教本

目次→フォーラム→FreeBASIC→補足FreeBASIC GTK tutorial←オリジナル・サイト

FreeBASIC GTK 教本 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

渡辺注:GTK の簡単な事例 も、ご覧ください。

このチュートリアルについて

これは、FreeBASIC と GTK の組合せについてのチュートリアルです。このチュートリアルでは、FreeBASIC で GTK ライブラリの描画ユーザ・インタフェースを作成します。チュートリアルは、初心者を対象にしています。基本を理解して、FreeBASIC で GTK を使う方法が分かれば、GTK +のチュートリアル で、更に GTK ライブラリの使い方を、続けて学ぶことができます。

 FreeBASIC は、GTK の使い方が、他のプログラム言語と異なります。PyGTK や GTK# のような結合はありません。FreeBASIC では、プログラム内の Cコードを直接呼び出します。この方法で、FreeBASIC は、C言語に密接に関連付けられています。

このチュートリアルの著作権は、Jan Bodnar が保有しています。
© 2010 - 2012 Jan Bodnar

FreeBASIC

 FreeBASIC は、評判の BASIC (Beginner's All-purpose Symbolic Instruction Code) コンパイラです。FreeBASIC は、QuickBASIC および C言語の影響を受け継いで、2004年に登場しました。FreeBASIC は、フリー、オープンソースの、32ビット BASIC コンパイラです。多くの Cライブラリを完全にサポートするために、ポインタ、プリ・プロセッサ、マクロ、のような多くの機能が、追加されています。これは、他の BASIC コンパイラには見られない特長です。

GTK

GTKのロゴ  GTK は描画ユーザインタフェースを作成するためのライブラリです。このライブラリは、Cプログラミング言語で作られています。GTK ライブラリは、GIMP ツールキットとも呼ばれています。もともと、このライブラリは、GIMP 画像操作プログラムを開発する過程で作成されました。以来、GTK は、Linux および BSD Unix で、最も人気のあるツール・キットの一つとなりました。今日、オープンソースの世界では、GUI ソフトウエアのほとんどは、Qt や GTK で作成されています。言語バインディングは、C++、Python、Perl、Java、C#や、他のプログラミング言語のために、存在しています。

渡辺 注:
 FreeBASIC でコンパイルしたファイル(exe)を実行するパソコンには、GTK ランタイム(GTK+ for Windows Runtime Environment)をインストールしておく必要が有ります。
 私は、下記で、gtk2-runtime-2.24.10-2012-10-10-ash.exe (gtk2-runtime-2.24.8-2011-12-03-ash.exe) をダウンロードしてインストールしました。
http://sourceforge.jp/projects/sfnet_gtk-win/
GTK ランタイムをインストールしても、パソコンを再起動しないと、下記のエラーになります。
「libglib-2.0-0.dll が見つからなかったため、このアプリケーションを開始できませんでした。」
追記:
私は、「エントリ ポイントが見つかりません」というエラーになってコンパイルできない場合がありました。
dll をプログラム・ソースのフォルダにコピーして、インストールした exe をアンインストールしたら解消しました。


目次

最初の例
[閉じる]ボタン
画像を表示
単純なメニューの例
エンター信号
チェック・ボタンの例
コンボ・ボックスの例


最初の例

 最初のコード例は、画面上の中央に、小さなウィンドウを生成します。
' ZetCode FreeBASIC GTK 教本
'
' 画面上の中央に、小さなウィンドウを生成します 
'
' 著作権 Jan Bodnar
' last modified July 2010
' website www.zetcode.com

#include once "gtk/gtk.bi"

#define NULL 0

Dim As GtkWidget Ptr win

gtk_init(NULL, NULL)

win = gtk_window_new(GTK_WINDOW_TOPLEVEL)
gtk_window_set_title(GTK_WINDOW(win), "Center")
gtk_widget_set_size_request(win, 250, 150)
gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER)

g_signal_connect(G_OBJECT(win), "destroy", _
    G_CALLBACK (@gtk_main_quit), NULL)

gtk_widget_show(win)
gtk_main()

END 0
 このコードは、画面上の中央に、ウィンドウを配置します。これは、FreeBASIC と Cコードの混在です。
#include once "gtk/gtk.bi"
 これは、ヘッダファイルで、FreeBASIC から GTK のコードを実行するために必要です。
#define NULL 0
 FreeBASIC には、NULL 値が内蔵されていません。そこで、より密接に GTK の Cコードに似せるために、NULL 値を定義します。
Dim As GtkWidget Ptr win
 GtkWidgetへのポインタを宣言します。
gtk_init(NULL, NULL)
 GTK ライブラリを開始します。
win = gtk_window_new(GTK_WINDOW_TOPLEVEL)
 GtkWidgetのウィンドウを作成します。ウィンドウのタイプはGTK_WINDOW_TOPLEVELです。トップレベルウィンドウは、タイトルバーと境界線があります。これらは、ウィンドウマネージャによって管理されます。
gtk_window_set_title(GTK_WINDOW(win), "Center")
gtk_widget_set_size_request(win, 250, 150)
gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER)
 この 3行は、ウィンドウのタイトルを設定し、ウィンドウのサイズを変更し、画面の中央に配置します。
g_signal_connect(G_OBJECT(win), "destroy", _
    G_CALLBACK (@gtk_main_quit), NULL)
 アプリケーションを終了するために X マークをクリックするか、Alt + F4キーを押すると、破壊信号が発せられます。ウィンドウは、デフォルトでは、破壊信号には反応しません。このため、明示的に gtk_main_quit()関数に破壊信号を接続して、アプリケーションを終了する必要があります。
上のコードに、二つの重要な文字があります。アンダースコアと@文字です。アンダースコアは、FreeBASIC の行継続文字です。コードの一つの行が、複数行にまたがる場合に、アンダースコアを使う必要があります。アットマーク(@)文字は、gtk_main_quit()関数のアドレスを、提供します。Cでは、関数名は関数のアドレスです。FreeBASIC ではそうなりません。このため、@文字を使うのです。
gtk_widget_show(win)
 ウィンドウは、メモリ内に作成されています。今、画面上にウィンドウを表示するために、gtk_widget_show関数を使用します。
gtk_main()
 アプリケーションのメインループに入ります。この時点で、アプリケーションが設置されて、イベントが発生するのを待ちます。
END 0
 FreeBASIC のコードを終了します。
$ fbc simple.bas
$ ./simple
 この例をコンパイルして、実行します。
簡単な例

[閉じる]ボタン

 二つ目の例では、ウィンドウ上にボタンのウィジェット(GUIのインタフェース部品の総称、コントロールともいう)を配置します。まず、ウィンドウに固定コンテナを配置して、このコンテナの上に、ボタンを配置します。ボタンをクリックすると、アプリケーションを終了します。
' ZetCode FreeBASIC GTK 教本
'
' ウィンドウ上に閉じるボタンを配置します
' ボタンをクリックすると、アプリケーションを終了します
'
' 著作権 Jan Bodnar
' last modified July 2010
' website www.zetcode.com

#include once "gtk/gtk.bi"

#define NULL 0

Dim As GtkWidget Ptr win
Dim As GtkWidget Ptr fixed
Dim As GtkWidget Ptr button

gtk_init(NULL, NULL)

win = gtk_window_new(GTK_WINDOW_TOPLEVEL)
gtk_window_set_title(GTK_WINDOW(win), "Close")
gtk_widget_set_size_request(win, 250, 150)
gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER)

g_signal_connect(G_OBJECT(win), "destroy", _
    G_CALLBACK (@gtk_main_quit), NULL)

fixed = gtk_fixed_new()
gtk_container_add(GTK_CONTAINER(win), fixed)
       
button = gtk_button_new_with_label("Close")
gtk_widget_set_size_request(button, 80, 35)

gtk_fixed_put(GTK_FIXED(fixed), button, 50, 50)

g_signal_connect(G_OBJECT(button), "clicked", _
    G_CALLBACK (@gtk_main_quit), NULL)
      
gtk_widget_show_all(win)

gtk_main()

END 0
 これは、閉じるボタンの例の、ソースコードです。
Dim As GtkWidget Ptr win
Dim As GtkWidget Ptr fixed
Dim As GtkWidget Ptr button
 3つの変数を宣言します。一つは、GUIアプリケーションの基本骨格であるトップレベルのウィンドウのためです。もう一つは、コンテナのためです。コンテナは、ウィジェット(GUIのインタフェース部品の総称、コントロールともいう) の特別な種類です。これは表示されず、目に見えません。この唯一の目的は、他のウィジェットを含めることです。ここでは、ボタンのウィジェットです。
fixed = gtk_fixed_new()
gtk_container_add(GTK_CONTAINER(win), fixed)
 この2行は、コンテナのウィジェットを作成し、ウィンドウのウィジェットの中に置きます。
button = gtk_button_new_with_label("Close")
gtk_widget_set_size_request(button, 80, 35)
 ボタンのウィジェットを作成し、それを 80x35 ピクセルのサイズにします。
gtk_fixed_put(GTK_FIXED(fixed), button, 50, 50)
 コンテナの x = 50、Y = 50 座標に、ボタンを置きます。これは絶対座標と呼ばれています。これは小さな例に適していますが、複雑なプログラムでは、レイアウト・マネージャを使います。
g_signal_connect(G_OBJECT(button), "clicked", _
    G_CALLBACK (@gtk_main_quit), NULL)
 ボタンをクリックすると、クリックされた信号が発せられます。g_signal_connect()関数は、コールバックに、この場合は、内蔵の gtk_main_quit()関数を、ボタンのウィジェットによって放出されるクリック信号に、接続します。
gtk_widget_show_all(win)
 我々は、3つのウィジェットを作りました。そのいずれからでも gtk_widget_show()を呼び出すことができます。あるいは、ワンステップですべての3つのウィジェットを表示する、ウィンドウのウィジェット上の、gtk_widget_show_all()を呼び出します。
[閉じる]ボタン

画像を表示

 次の例では、ウィンドウ上に画像を表示します。
' ZetCode FreeBASIC GTK 教本
'
' ウィンドウ上に画像を表示します
'
' 著作権 Jan Bodnar
' last modified July 2010
' website www.zetcode.com

#include once "gtk/gtk.bi"
#include once "gtk/gdk.bi"

#define NULL 0

Dim As GtkWidget Ptr win
Dim As GtkWidget Ptr image

gtk_init(NULL, NULL)

win = gtk_window_new(GTK_WINDOW_TOPLEVEL)
gtk_window_set_title(GTK_WINDOW(win), "Red Rock")
gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER)

g_signal_connect(G_OBJECT(win), "destroy", _
    G_CALLBACK (@gtk_main_quit), NULL)

gtk_window_set_resizable(GTK_WINDOW(win), FALSE)
gtk_container_set_border_width(GTK_CONTAINER(win), 2)

image = gtk_image_new_from_file("redrock.png")
gtk_container_add(GTK_CONTAINER(win), image)
      
gtk_widget_show_all(win)

gtk_main()

END 0
 ウィンドウ上に Red Rock の城の画像を表示します。城は、スロバキア(Slovakia)の西部に位置しています。
Dim As GtkWidget Ptr win
Dim As GtkWidget Ptr image
 この例にあるのは、2つのウィジェット(GUIのインタフェース部品の総称、コントロールともいう) だけです。ウィンドウのウィジェットと、画像のウィジェットです。
gtk_window_set_resizable(GTK_WINDOW(win), FALSE)
 ウィンドウのサイズを変更することはできません。ウィンドウのサイズを指定していないことに注意して下さい。このような場合、ウィンドウは自動的に画像のサイズに適合します。
gtk_container_set_border_width(GTK_CONTAINER(win), 2)
 コンテナの周りに、わずかのスペースを入れます。
image = gtk_image_new_from_file("redrock.png")
gtk_container_add(GTK_CONTAINER(win), image)
 PNGファイルから、画像のウィジェットを作成します。画像をウィンドウに配置します。ウィンドウ自体は、単純なコンテナです。このウィンドウに、1つのウィジェットを含めることができます。
の画像

単純なメニューの例

 次のコード例では、シンプルなメニューを作成します。
' ZetCode FreeBASIC GTK 教本
'
' 簡単なメニューを表示します
'
' 著作権 Jan Bodnar
' last modified July 2010
' website www.zetcode.com

#include once "gtk/gtk.bi"

#define NULL 0

Dim As GtkWidget Ptr win
Dim As GtkWidget Ptr vbox

Dim As GtkWidget Ptr menubar
Dim As GtkWidget Ptr fmenu
Dim As GtkWidget Ptr fmi
Dim As GtkWidget Ptr qmi


gtk_init(NULL, NULL)

win = gtk_window_new(GTK_WINDOW_TOPLEVEL)
gtk_window_set_title(GTK_WINDOW(win), "Simple menu")
gtk_widget_set_size_request(win, 250, 150)
gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER)

g_signal_connect(G_OBJECT(win), "destroy", _
    G_CALLBACK (@gtk_main_quit), NULL)

vbox = gtk_vbox_new(FALSE, 0)
gtk_container_add(GTK_CONTAINER(win), vbox)


menubar = gtk_menu_bar_new()
fmenu = gtk_menu_new()

fmi = gtk_menu_item_new_with_label("File")
qmi = gtk_menu_item_new_with_label("Quit")

gtk_menu_item_set_submenu(GTK_MENU_ITEM(fmi), fmenu)
gtk_menu_shell_append(GTK_MENU_SHELL(fmenu), qmi)
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fmi)
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0)

g_signal_connect(G_OBJECT(qmi), "activate", _
    G_CALLBACK(@gtk_main_quit), NULL)
      
gtk_widget_show_all(win)

gtk_main()

END 0
 このコード行は、シンプルなメニューを作成します。これは、ただ一つのメニュー項目だけで、この項目を選択すると、アプリケーションを終了させます。メニューバーを作ると、少し入り組んできます。メニューバーとメニューの両方が、同じウィジェット(GUIのインタフェース部品の総称、コントロールともいう) 、すなわちメニュー・シェルから導かれているに注意して下さい。メニュー項目は、メニューに対してのみ有効な子構成です。これらは、サブメニューを実装するために使用されます。
Dim As GtkWidget Ptr win
Dim As GtkWidget Ptr vbox

Dim As GtkWidget Ptr menubar
Dim As GtkWidget Ptr fmenu
Dim As GtkWidget Ptr fmi
Dim As GtkWidget Ptr qmi
 6つのウィジェットのために、6つの変数を設定します。一つのウィジェットは、垂直方向のボックスで、レイアウトを設定します。メニューバーは、水平方向のウィジェットで、その上にメニューを配置します。メニューには、アクションを実行するいくつかのメニュー項目が含まれています。例えば、文書を保存するとかアプリケーションを終了するなどです。
vbox = gtk_vbox_new(FALSE, 0)
gtk_container_add(GTK_CONTAINER(win), vbox)
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 3)
 垂直ボックスを作成して、それがトップレベル・ウィンドウのコンテナになります。gtk_vbox_new()関数の最初のパラメータは、同次パラメータと呼ばれています。TRUE に設定すると、ボックス内のすべてのウィジェットは、同じスペース配分になります。この場合は、メニューバーがウィンドウの小さい部分だけを取るので、これを使いません。二番目のパラメータは、構成子項目の間の空間です。
menubar = gtk_menu_bar_new()
fmenu = gtk_menu_new()
 このコードでは、メニューバーとメニューを作成します。
fmi = gtk_menu_item_new_with_label("File")
qmi = gtk_menu_item_new_with_label("Quit")
 二つのメニュー項目が作られます。
gtk_menu_item_set_submenu(GTK_MENU_ITEM(fmi), fmenu)
 このコード行は、ファイルメニューを実装します。ロジックは、メニューバーは、メニュー・シェルであるということです。ファイルメニューも、メニュー・シェルです。サブメニューまたはサブシェルとして、ファイルのメニューを見るからです。
gtk_menu_shell_append(GTK_MENU_SHELL(fmenu), qmi)
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fmi)
 メニュー項目は、gtk_menu_shell_append()関数を呼び出すことによって実装されています。メニュー項目は、メニュー・シェルに追加されます。このケースでは、メニューの項目 quit が、ファイル・メニューに追加され、また、ファイル・メニュー項目が、メニューバーに追加されます。
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0)
 gtk_box_pack_start()関数呼び出しは、垂直ボックスにメニューバーを追加します。最初のパラメータは、子構成のウィジェットを配置するためのコンテナです。二番目のパラメータは、子構成のウィジェットです。三番目のパラメータは、拡張パラメータです。拡張パラメータで TRUE に設定された子構成は、垂直ボックスから、追加の空白を確保します。この追加の空白は、子構成項目の間で均等に配分されます。ここでは、メニューバーに、追加の領域は必要ないので、拡張パラメータを FALSE に設定します。拡張が FALSE に設定されている場合、四番目のパラメータは、何の効果もありません。最後のパラメータは、パディング(埋め草)で、子構成のウィジェットの間に、いくらかの余分なスペースを追加します。この例では、余分なスペースを追加しません。
g_signal_connect(G_OBJECT(qmi), "activate", _
    G_CALLBACK(@gtk_main_quit), NULL)
 Quit (終了)メニュー項目を選択すると、アプリケーションを終了します。
シンプルなメニュー

エンター信号

 次の例では、エンター信号に反応する方法を、紹介します。マウス・ポインタが、ウィジェット(GUIのインタフェース部品の総称、コントロールともいう) の領域に入ると、Enter 信号が、放出されます。

渡辺 注:うまく動きません。(^_^;)

' ZetCode FreeBASIC GTK 教本
'
' 入力信号に反応して、ボタンの背景色を変えます
'
' 著作権 Jan Bodnar
' last modified July 2010
' website www.zetcode.com

#include once "gtk/gtk.bi"

#define NULL 0

Dim As GtkWidget Ptr win
Dim As GtkWidget Ptr fixed
Dim As GtkWidget Ptr btn


Sub enter_button Cdecl (Byval widget As GtkWidget Ptr, _
    Byval dat As gpointer)
 
  Dim col As GdkColor

  col.red = 27000
  col.green = 30325
  col.blue = 34181
  gtk_widget_modify_bg(widget, GTK_STATE_PRELIGHT, @col)
  
End Sub


gtk_init(NULL, NULL)

win = gtk_window_new(GTK_WINDOW_TOPLEVEL)
gtk_window_set_title(GTK_WINDOW(win), "enter signal")
gtk_widget_set_size_request(win, 230, 150)
gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER)

g_signal_connect(G_OBJECT(win), "destroy", _
    G_CALLBACK (@gtk_main_quit), NULL)

fixed = gtk_fixed_new()
gtk_container_add(GTK_CONTAINER(win), fixed)

btn = gtk_button_new_with_label("Button")
gtk_widget_set_size_request(btn, 80, 35)
gtk_fixed_put(GTK_FIXED(fixed), btn, 50, 50)

g_signal_connect(G_OBJECT(btn), "enter", _
    G_CALLBACK(@enter_button), NULL)
      
gtk_widget_show_all(win)

gtk_main()

END 0
 固定コンテナ内に、ボタンのウィジェット(GUIのインタフェース部品の総称、コントロールともいう) を置きます。ボタンのウィジェットの領域に入ると、enter_button()サブルーチンが呼び出されます。サブルーチンの中で、ボタンの背景色を変更します。
Sub enter_button Cdecl (Byval widget As GtkWidget Ptr, _
    Byval dat As gpointer)
...
End Sub
 これは、enter_button()サブルーチンで、エンター信号に反応します。Cdecl キーワードは、サブルーチンの呼び出し規約を指定します。この呼び出し規約では、すべてのパラメータは、それらがリストされている逆の順序で、つまり、右から左の順に、渡されます。このケースでは、これは重要ではありません。
Dim col As GdkColor
 ローカル GdkColorの 変数を作成します。これは、GTK アプリケーションで色を記述するために使う構造です。
col.red = 27000
col.green = 30325
col.blue = 34181
 ここで、色を設定します。
gtk_widget_modify_bg(widget, GTK_STATE_PRELIGHT, @col)
 gtk_widget_modify_bg()は、特定の状態のウィジェットの背景色を設定します。このケースでは、状態は、GTK_STATE_PRELIGHT です。これは、マウス・ポインタが、ウィジェットの上にあるときです。三番目のパラメータは、色の構造体へのポインタです。
g_signal_connect(G_OBJECT(btn), "enter", _
    G_CALLBACK(@enter_button), NULL)
 ここで、enter_button()サブルーチンを、ボタンのウィジェットによって放出されるエンター信号に、接続します。

チェック・ボタンの例

 次の例では、固定コンテナの中に、チェック・ボタンを入れます。チェック・ボタンのチェックを入れたり外したりすると、ウィンドウのタイトルが、表示または非表示になります。
' ZetCode FreeBASIC GTK 教本
'
' チェック・ボタンの例です
' ウィンドウのタイトルの表示・非表示を切り替えます
'
' 著作権 Jan Bodnar
' last modified July 2010
' website www.zetcode.com

#include once "gtk/gtk.bi"

#define NULL 0

Dim As GtkWidget Ptr win
Dim As GtkWidget Ptr cbtn
Dim As GtkWidget Ptr frame

Sub toggle_title Cdecl (Byval widget As GtkWidget Ptr, _
    Byval win As gpointer)

  If gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) Then
      gtk_window_set_title(win, "Check button")
  Else 
      gtk_window_set_title(win, "")
  End If
End Sub


gtk_init(NULL, NULL)

win = gtk_window_new(GTK_WINDOW_TOPLEVEL)
gtk_window_set_title(GTK_WINDOW(win), "Check button")
gtk_widget_set_size_request(win, 250, 150)
gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER)

g_signal_connect(G_OBJECT(win), "destroy", _
    G_CALLBACK (@gtk_main_quit), NULL)

frame = gtk_fixed_new()
gtk_container_add(GTK_CONTAINER(win), frame)

cbtn = gtk_check_button_new_with_label("Show title")
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cbtn), TRUE)
gtk_fixed_put(GTK_FIXED(frame), cbtn, 50, 50)

g_signal_connect(cbtn, "clicked", _
    G_CALLBACK(@toggle_title), cast(gpointer, win))
      
gtk_widget_show_all(win)

gtk_main()

END 0
 これは、チェック・ボタンの例のコードです。
Sub toggle_title Cdecl (Byval widget As GtkWidget Ptr, _
    Byval win As gpointer)
 チェック・ボタンをクリックすると、toggle_title()関数が呼び出されます。このケースでは、二つのオブジェクトへのポインタが必要です。一つは、それがチェックされているかどうかを判断するための、チェック・ボタンへのポインタです。もう一つは、そのタイトルを設定または解除するウィンドウへのポインタです。
If gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) Then
    gtk_window_set_title(win, "Check button")
Else 
    gtk_window_set_title(win, "")
 gtk_toggle_button_get_active()関数を使って、チェック・ボタンの状態を決定します。gtk_window_set_title()関数を使っ、てウィンドウのタイトルを設定します。
g_signal_connect(cbtn, "clicked", _
    G_CALLBACK(@toggle_title), cast(gpointer, win))
 g_signal_connect()の最後のパラメータは、通常、コールバック関数に渡したい、いくつかのデータです。今回は、ウィンドウ・オブジェクトに、別のポインタを渡す必要があります。このような場合には、型変換する必要があります。関数は、gpointer 型が、ウィンドウは、GtkWidget 型が、想定されているためです。FreeBASIC には、型変換を行うための、case キーワードが有ります。
チェック・ボタン

コンボ・ボックスの例

 FreeBASIC の GTK 教本の最後の例として、コンボ・ボックスのウィジェット(GUIのインタフェース部品の総称、コントロールともいう) を紹介します。
' ZetCode FreeBASIC GTK 教本
'
' コンボ・ボックスのウィジェット(GUIのインタフェース部品の総称、コントロールともいう) 
'
' 著作権 Jan Bodnar
' last modified July 2010
' website www.zetcode.com

#include once "gtk/gtk.bi"

#define NULL 0

Dim As GtkWidget Ptr win
Dim As GtkWidget Ptr combo
Dim As GtkWidget Ptr fixed
Dim As GtkWidget Ptr label


Sub combo_selected Cdecl (Byval widget As GtkWidget Ptr, _
    Byval win As gpointer)
 
  Dim As gchar Ptr text

  text =  gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget))
  gtk_label_set_text(GTK_LABEL(win), text)
  g_free(text)
End Sub


gtk_init(NULL, NULL)

win = gtk_window_new(GTK_WINDOW_TOPLEVEL)
gtk_window_set_title(GTK_WINDOW(win), "Check button")
gtk_widget_set_size_request(win, 230, 150)
gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER)

g_signal_connect(G_OBJECT(win), "destroy", _
    G_CALLBACK (@gtk_main_quit), NULL)

fixed = gtk_fixed_new()

combo = gtk_combo_box_new_text()
gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Ubuntu")
gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Mandriva")
gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Fedora")
gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Mint")
gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Gentoo")
gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Debian")

gtk_fixed_put(GTK_FIXED(fixed), combo, 50, 50)
gtk_container_add(GTK_CONTAINER(win), fixed)

label = gtk_label_new("-")
gtk_fixed_put(GTK_FIXED(fixed), label, 50, 110)

g_signal_connect(G_OBJECT(combo), "changed", _
    G_CALLBACK(@combo_selected), cast(gpointer, label))
      
gtk_widget_show_all(win)

gtk_main()

END 0
 2つのウィジェット(GUIのインタフェース部品の総称、コントロールともいう) :コンボ・ボックスとラベル、を持っています。コンボ・ボックスから選択したオプションは、ラベルに表示されます。
Dim As gchar Ptr text

text =  gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget))
gtk_label_set_text(GTK_LABEL(win), text)
g_free(text)
 これらの行で、コンボ・ボックスからテキストを取得して、ラベルに設定します。gchar へのポインタを使います。これは、glib ライブラリの基本的な型で、glib ライブラリは、GTK ライブラリの基盤です。そして、コンボ・ボックスからテキストを取得するときに作成されたメモリを解放します。
combo = gtk_combo_box_new_text()
gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Ubuntu")
gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Mandriva")
...
 コンボ・ボックスのウィジェットが作成されて、データが入力されます。
label = gtk_label_new("-")
gtk_fixed_put(GTK_FIXED(fixed), label, 50, 110)
 ラベルのウィジェットを作成して、コンテナの中に入れます。
g_signal_connect(G_OBJECT(combo), "changed", _
    G_CALLBACK(@combo_selected), cast(gpointer, label))
 combo_selected()関数を、コンボ・ボックスの変更された信号に接続します。そして、再び型変換を行います。

コンボ・ボックスのウィジェット(GUIのインタフェース部品の総称、コントロールともいう)


 これで、FreeBASIC の GTK 教本は終わりです。FreeBASIC 言語と GTK ライブラリの使い方について、いくつかの例を示しました。これらの例は、明らかに FreeBASIC と C言語を混在させることを示しています。あなたは、この二つの言語を一緒に使う方法を知ったので、GTK プログラミングを始めることができるでしょう。GTKライブラリの詳細については、The GTK+ tutorial を参照下さい。
 
渡辺注:GTK の簡単な事例 も、ご覧ください。
補足 に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2010-07-11
著作権:Jan Bodnar 、日本語翻訳:WATANABE Makoto
© 2010 - 2012 Jan Bodnar

ホームページのトップに戻る