Gtkmm 導入

C++ で GUI アプリケーションを作ろうとすると、「どの GUI ツールキットを使うべきか」で迷うことがよくあります。Win32 API や MFC はどうしても煩雑で扱いづらく、.NET Framework を使うと C++ を書いている感覚が薄れてしまう…。そんな中で見つけたのが Gtkmm です。

GTK+ は GIMP のために開発された GUI ツールキットで、現在では GNOME でも採用されるほど成熟しています。ただし GTK+ は C 言語向けの API のため、C++ で扱うには少し不便です。そこで登場するのが GTK+ を C++ 向けにラッピングした Gtkmm です。

この記事では、Visual C++ 2010 ExpressGtkmm 2.22 を使って、最小限の GUI アプリを動かすまでの手順を紹介します。

Gtkmm のダウンロードとインストール

Gtkmm for Windows(MSVC 用バイナリ)は、公式サイトからインストーラを取得するだけで利用できます。

Visual C++ 2010 Express でプロジェクトを作成

  1. Win32 コンソール アプリケーション を選択
  2. 「空のプロジェクト」を選択して作成

Gtkmm はコンソールアプリとして開始し、後から GUI を表示するスタイルで問題ありません。

image1.png
image2.png

プロパティシートの追加(Gtkmm の組み込み)

image3.png

Visual C++ の プロパティ マネージャ を開き、 Debug | Win32 → 右クリック → 既存のプロパティ シートの追加

gtkmmMSVCgtkmm-vc100-d-2_4.props を選択します。Release 構成では gtkmm-vc100-2_4.props を追加します。 これにより、インクルードパス・ライブラリパス・リンク設定が自動で適用されます。

最小の Gtkmm コードを書く

#include <gtkmm.h>

class MainWin : public Gtk::Window {
public:
    MainWin();

private:
    Gtk::Button m_button;
    Gtk::HBox   m_hbox;
};

MainWin::MainWin()
: m_button("Button")
{
    m_hbox.pack_start(m_button);
    add(m_hbox);
    show_all_children();
}

int main(int argc, char* argv[]) {
    Gtk::Main kit(argc, argv);
    MainWin mainwin;
    Gtk::Main::run(mainwin);
    return 0;
}
image4.png

Gtkmm はウィジェットの配置が直感的で、最小コードでも GUI が動きます。

気になる点

  • Pango のフォント警告:「Pango-WARNING **: couldn’t load font “メイリオ Not-Rotated 9”」と警告が出ますが、Windows で GTK+ が日本語フォントを正しく認識できない場合に発生します。 フォントキャッシュの再生成や、pango.aliases の調整で改善することがあります。
  • 日本語表示の文字化け:Gtkmm は UTF-8 を前提としているため、ソースコードの文字コードを UTF-8 にするか、外部ファイル(XML など)で文字列を管理する必要があります。
  • ifstream と相性が悪い?:ifstreamに日本語のパスを入れられないです。Windows のマルチバイト API では日本語パスが扱えないため、 g_file_get_contents()(Glib)や std::ifstream のワイド文字版を使う必要があります。

まとめ

Gtkmm は C++ で GUI を作りたい人にとって、 シンプルで扱いやすいモダンな選択肢です。

コメント

“Gtkmm 導入” への2件のフィードバック

  1. cox58

    得意のプログラミングで、このブログを某超有名ブログのように、
    スマートフォンでも見やすくしてほしいです。

  2. きたけん

    あースマートフォンですか・・・やってみたいんですけど、あたしがスマートフォン持ってないんで、ちゃんと表示されるかどうかチェックできないんですよね-。
    前向きに検討するということでお願いします(笑)

きたけん へ返信するコメントをキャンセル

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください