C++でプログラミングをやっているときに一番困るのが、どのGUIツールを使うかです。どうもWin32 APIやらMFCなんかは肌になじまない(というか煩雑すぎませんか!?)ですし、.net Frameworkを使い始めるとどうもC++を触っている気がしなくなってくるし・・・。
ということで最近見つけたのが、GtkmmというGUIツールキット。
すっかり最近はお馴染みになったGIMPのために開発されたGUIツールキットにGTK+というものがあります。これがあんまりにも優秀だったのでGNOMEにも採用されているというほど。で、このGTK+にはC言語が使われているのですが、わたくしC++から勉強したのでどうもC言語には不慣れでして、探してみたらGTK+をC++にラッピングしたGtkmmというものを見つけたというわけです。
では実際に触ってみることにします。
今回はVisual C++ 2010 ExpressとGtkmm 2.22を利用しています。
★ まずはダウンロード
一番上のDownloadからダウンロード。
★ インストール
ダウンロードした実行ファイルを実行すれば簡単にインストール完了。
★ Visual C++への組み込み
まずはソリューションの作成から。

「Win32 コンソール アプリケーション」を選択し、適当に名前をつけます。

先に進んで、「空のプロジェクト」を選択します。

そしてまず「プロパティーマネージャ」を開いて、「Debug | Win32」を右クリックし、「既存のプロパティ シートの追加」を選択します。
でデフォルト設定のままインストールしている場合、「C:gtkmmMSVCgtkmm-vc100-d-2_4.props」を選択します。「Release | Win32」も同様に「gtkmm-vc100-2_4.props」を選択します。VCのバージョンによって多少選択するファイルは変わってきます。
これで前準備は完了。
★ コード入力
あとはコードを入力するだけ。
#include <gtkmm.h> class MainWin : public Gtk::Window { Gtk::Button m_button; Gtk::HBox m_hbox; public: MainWin(); }; MainWin::MainWin() : m_button("Button") { this->m_hbox.pack_start(this->m_button); add(this->m_hbox); show_all_children(); } int main(int argc, char *argv[]) { Gtk::Main kit(argc, argv); MainWin mainwin; Gtk::Main::run(mainwin); return 0; }
で、ビルドをかけます。警告がいろいろ出ますが、無視w

ボタンが表示されるだけですが、この行数でこれだけできるのはうれしい限りです。このほかメニューバーやツールバー、各種コントロールの配置も簡単にできます。
いくつか気になる点があるのも事実ですが・・・
- コンソール画面に「(Hoge.exe:4368): Pango-WARNING **: couldn’t load font “メイリオ Not-Rotated 9”, falling back to “Sans Not-Rotated 9”, expect ugly output.」と表示されるorz
- 日本語表示が文字化けして出来ない(直接Unicodeをたたき込めば大丈夫ですが・・・あまりに不便。日本語周りをXMLか何かにほりこんで、それを流し込むのが楽かな)
- 一部C++の標準ライブラリと相性が悪いみたいです。わたしはifstreamと併用できませんでした。これも言語関係かなぁ。(追記:VC 2008なら動きました!) (2010/12/11追記)すいません、これって諸悪の根源はVCみたいです。ifstreamに日本語のパスを入れられないらしいです。だからGlibにあるg_file_get_contents関数を利用した方が早そうですね。
そんなこんなですが、これから勉強していく所存です。。。
あと参考文献。
■ gtkmm 入門
■ gtkmmプログラミング
インストールされたもののなかにDemoが入ってます。これも結構参考になりますよ。
https://kitaken.skr.jp/wp-content/uploads/2011/03/shape2.svg
得意のプログラミングで、このブログを某超有名ブログのように、
スマートフォンでも見やすくしてほしいです。
あースマートフォンですか・・・やってみたいんですけど、あたしがスマートフォン持ってないんで、ちゃんと表示されるかどうかチェックできないんですよね-。
前向きに検討するということでお願いします(笑)