飴屋ぷろじぇくと

 ちょっとカテゴリを分けてみようかなっと。

--.--.--[--] スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2014.10.25[土] Windowsのリソースを強引にFreeBASIC+GTKのソースに変換してみる

前回の続編です。
今度はWindowsリソースファイルからGTKを使ってウィンドウを生成するコードに変換するというある意味力技です。
ウィジットを配置する豊富なレイアウトを封殺してGtkFixedのみを使いますから実用価値がどの程度か疑問ですが、ResEdit等を使ってお手軽にGTKのウィンドウアプリのひな形を生成することが出来ます。
例によってプログラムはまたC++ですが、GTKを使うプログラムをコンパイルするのに少し嵌りました。インクルードの指定が大量に必要なんですね。
FreeBASICはライブラリパスだけでよかったから油断してました。
こんな感じ。
>set GTK=C:\gtk+2.24.10_win32
>g++ -o rc2fbgtk rc2fbgtk.cpp -I"%GTK%/include\gtk-2.0" -I"%GTK%/include\glib-2.0" -I"%GTK%/lib\glib-2.0\include" -I"%GTK%/include\cairo" -I"%GTK%/include\pango-1.0" -I"%GTK%/lib\gtk-2.0\include" -I"%GTK%/include\gdk-pixbuf-2.0" -I"%GTK%/include\atk-1.0" -L"%GTK%/lib" -lgdk-win32-2.0 -lgtk-win32-2.0 -lglib-2.0 -lgobject-2.0 -lcairo -static

ソースコードは整形が上手くいかなかったので直接の掲載はなしです。以下からご覧ください。
rc2fbgtk.cpp
・現状ラベル、プッシュボタン、チェックボックス、ラジオボタン、メニューが変換可能で、それ以外は無視されます。
・前回のと同じくダイアログが一つ、メニューも一組のみ対応です。ダイアログが複数入ったリソースファイルだとどうなるか判りませんのでご注意ください。
・シグナルコールバック(Windowsでいう所のイベントプロシージャ)のひな形も生成してくれます。
・リソースはUTF-8で保存しないと文字化けします。
・テンプレートファイルは不要になりました。
・コンパイル済みバイナリはこちら rc2fbgtk.zip

例) こんなリソースを、
testrc2.rc
こんな風に表示するFBのソースに変換します。
fb-rc-gtk.png
以下、出力のFBコード:
こんなコードを出力します。
#include "gtk/gtk.bi"

sub child_set_font_callback cdecl(widget As GtkWidget Ptr, gdata As gpointer)
    gtk_widget_modify_font(GTK_WIDGET(widget), Cast(PangoFontDescription Ptr, gdata))
end sub
sub child_set_font(widget As GtkWidget Ptr, font_desc As PangoFontDescription Ptr)
    gtk_container_foreach(GTK_CONTAINER(widget), Cast(GtkCallback, @child_set_font_callback), Cast(gpointer, font_desc))
end sub

' declare menu
Dim Shared menu1 As GtkWidget Ptr
Dim Shared item10 As GtkWidget Ptr
Dim Shared menu110 As GtkWidget Ptr
Dim Shared mNew1 As GtkWidget Ptr
Dim Shared mOpen1 As GtkWidget Ptr
Dim Shared mQuit1 As GtkWidget Ptr
' declare dialog
Dim Shared dialog1 As GtkWidget Ptr
Dim Shared vbox As GtkWidget Ptr
Dim Shared fixed As GtkWidget Ptr
Dim font_desc As PangoFontDescription Ptr
Dim Shared checkbox1 As GtkWidget Ptr
Dim Shared radio1 As GtkWidget Ptr
Dim Shared radio2 As GtkWidget Ptr
Dim Shared btnCancel As GtkWidget Ptr
Dim Shared btnOK As GtkWidget Ptr
Dim Shared static1 As GtkWidget Ptr

Declare Sub mNew1_activate Cdecl (ByVal widget As GtkWidget Ptr, gdata As gpointer)
Declare Sub mOpen1_activate Cdecl (ByVal widget As GtkWidget Ptr, gdata As gpointer)
Declare Sub mQuit1_activate Cdecl (ByVal widget As GtkWidget Ptr, gdata As gpointer)
Declare Sub checkbox1_toggled Cdecl (ByVal widget As GtkWidget Ptr, gdata As gpointer)
Declare Sub radio1_toggled Cdecl (ByVal widget As GtkWidget Ptr, gdata As gpointer)
Declare Sub radio2_toggled Cdecl (ByVal widget As GtkWidget Ptr, gdata As gpointer)
Declare Sub btnCancel_clicked Cdecl (ByVal widget As GtkWidget Ptr, gdata As gpointer)
Declare Sub btnOK_clicked Cdecl (ByVal widget As GtkWidget Ptr, gdata As gpointer)
Declare Sub dialog1_destroy Cdecl (ByVal widget As GtkWidget Ptr, gdata As gpointer)

gtk_init(NULL,NULL)

' menu
menu1 = gtk_menu_bar_new()
menu110 = gtk_menu_new()
mNew1 = gtk_menu_item_new_with_mnemonic("新規(&N)")
gtk_container_add(GTK_CONTAINER(menu110), mNew1)
g_signal_connect(G_OBJECT(mNew1), "activate", G_CALLBACK(@mNew1_activate), NULL)
mOpen1 = gtk_menu_item_new_with_mnemonic("開く(&O)")
gtk_container_add(GTK_CONTAINER(menu110), mOpen1)
g_signal_connect(G_OBJECT(mOpen1), "activate", G_CALLBACK(@mOpen1_activate), NULL)
gtk_container_add(GTK_CONTAINER(menu110), gtk_menu_item_new())
mQuit1 = gtk_menu_item_new_with_mnemonic("終了(&Q)")
gtk_container_add(GTK_CONTAINER(menu110), mQuit1)
g_signal_connect(G_OBJECT(mQuit1), "activate", G_CALLBACK(@mQuit1_activate), NULL)
item10 = gtk_menu_item_new_with_mnemonic("ファイル(&F)")
gtk_container_add(GTK_CONTAINER(menu1), item10)
gtk_menu_item_set_submenu(GTK_MENU_ITEM(item10), menu110)

' dialog
dialog1 = gtk_window_new(GTK_WINDOW_TOPLEVEL)
gtk_window_set_resizable(GTK_WINDOW(dialog1), TRUE)
gtk_widget_set_size_request(dialog1, 325, 175)
gtk_window_set_position (GTK_WINDOW(dialog1), GTK_WIN_POS_NONE)
gtk_window_set_title (GTK_WINDOW(dialog1), "Dialog")
vbox = gtk_vbox_new(FALSE,2)
gtk_box_pack_start(GTK_BOX(vbox), menu1, FALSE, FALSE, 0)
gtk_container_add(GTK_CONTAINER(dialog1), vbox)
fixed = gtk_fixed_new()
font_desc = pango_font_description_from_string("MS UI Gothic 10")

'Controls
checkbox1 = gtk_check_button_new_with_label("Check1")
g_signal_connect(G_OBJECT(checkbox1), "toggled", G_CALLBACK(@checkbox1_toggled), dialog1)
child_set_font(checkbox1, font_desc)
gtk_widget_set_size_request(checkbox1, 70, 16)
gtk_fixed_put(GTK_FIXED(fixed), checkbox1, 49, 50)
radio1 = gtk_radio_button_new_with_label(NULL, "Radio1")
Dim group1 As GSList Ptr = gtk_radio_button_group (GTK_RADIO_BUTTON (radio1))
g_signal_connect(G_OBJECT(radio1), "toggled", G_CALLBACK(@radio1_toggled), dialog1)
child_set_font(radio1, font_desc)
gtk_widget_set_size_request(radio1, 70, 16)
gtk_fixed_put(GTK_FIXED(fixed), radio1, 49, 76)
radio2 = gtk_radio_button_new_with_label(group1, "Radio2")
g_signal_connect(G_OBJECT(radio2), "toggled", G_CALLBACK(@radio2_toggled), dialog1)
child_set_font(radio2, font_desc)
gtk_widget_set_size_request(radio2, 70, 16)
gtk_fixed_put(GTK_FIXED(fixed), radio2, 136, 76)
btnCancel = gtk_button_new_with_label("キャンセル")
g_signal_connect(G_OBJECT(btnCancel), "clicked", G_CALLBACK(@btnCancel_clicked), dialog1)
child_set_font(btnCancel, font_desc)
gtk_widget_set_size_request(btnCancel, 87, 29)
gtk_fixed_put(GTK_FIXED(fixed), btnCancel, 222, 107)
btnOK = gtk_button_new_with_label("OK")
g_signal_connect(G_OBJECT(btnOK), "clicked", G_CALLBACK(@btnOK_clicked), dialog1)
child_set_font(btnOK, font_desc)
gtk_widget_set_size_request(btnOK, 87, 29)
gtk_fixed_put(GTK_FIXED(fixed), btnOK, 124, 107)
static1 = gtk_label_new("HELLO RESOURCE 123456789")
gtk_widget_modify_font(GTK_WIDGET(static1), font_desc)
gtk_widget_set_size_request(static1, 175, 13)
gtk_fixed_put(GTK_FIXED(fixed), static1, 50, 27)
gtk_container_add(GTK_CONTAINER(vbox), fixed)
g_signal_connect (G_OBJECT(dialog1), "destroy", G_CALLBACK(@dialog1_destroy),NULL)

gtk_widget_show_all(dialog1)
gtk_main()

'-------------------------------------------

Sub mNew1_activate Cdecl (ByVal widget As GtkWidget Ptr, ByVal gdata As gpointer)
    'Please write your codes here.
End Sub

Sub mOpen1_activate Cdecl (ByVal widget As GtkWidget Ptr, ByVal gdata As gpointer)
    'Please write your codes here.
End Sub

Sub mQuit1_activate Cdecl (ByVal widget As GtkWidget Ptr, ByVal gdata As gpointer)
    'Please write your codes here.
End Sub

Sub checkbox1_toggled Cdecl (ByVal widget As GtkWidget Ptr, ByVal gdata As gpointer)
    If GTK_TOGGLE_BUTTON(widget)->active Then
        ' button is raised.
    Else
        ' button is sunken.
    End If
End Sub

Sub radio1_toggled Cdecl (ByVal widget As GtkWidget Ptr, ByVal gdata As gpointer)
    If GTK_TOGGLE_BUTTON(widget)->active Then
        ' button is raised.
    Else
        ' button is sunken.
    End If
End Sub

Sub radio2_toggled Cdecl (ByVal widget As GtkWidget Ptr, ByVal gdata As gpointer)
    If GTK_TOGGLE_BUTTON(widget)->active Then
        ' button is raised.
    Else
        ' button is sunken.
    End If
End Sub

Sub btnCancel_clicked Cdecl (ByVal widget As GtkWidget Ptr, ByVal gdata As gpointer)
    'Please write your codes here.
End Sub

Sub btnOK_clicked Cdecl (ByVal widget As GtkWidget Ptr, ByVal gdata As gpointer)
    'Please write your codes here.
End Sub

Sub dialog1_destroy Cdecl (ByVal widget As GtkWidget Ptr, ByVal gdata As gpointer)
    'Please write your codes here.
End Sub

こちらに掲載及び配布するソースコードの使用・転載等は自由にしていただいて構いませんが、コードの品質・プログラムの動作不具合や使用を因とするあらゆる不利益等を当方は一切保証しません。あくまで自己責任でお願いします。

Comment






(編集・削除用)

Trackback

http://utau2009.blog114.fc2.com/tb.php/23-ffe3e19d

この記事にトラックバック(FC2Blog User)

Copyright © 飴屋/菖蒲

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。