パソコンでプログラミングしよう ウィンドウズC++プログラミング環境の構築
1.6.3.6(15)
wxWidgetsプロジェクトウィザード(K1)

wxWidgetsプロジェクト用に導入する統合開発環境Code::Blocksウィザードを説明する。

Code::Blocksはスクリプトで機能拡張できる。スクリプト言語はSquirrelを用いる。ウィザードスクリプトは[File|New|Project]などの表示する[New from template]ダイアログの[Projects]、[Build tagets]、[Files]、[Custom]ページに一覧される各ウィザードを実行する。

wxWidgetsライブラリによるウィンドウズデスクトップアプリケーション開発用に本サイトが作成したウィザードwxWidgets project (K1)について説明する。

  • 32ビット/64ビットおよびデバッグビルド/リリースビルドを組み合わせた複数ターゲットを生成する。
  • C++標準ライブラリとwxWidgetsライブラリは静的リンクされる。

ウィザードの登録

ウィザードはウィザードディレクトリにサブディレクトリとして配置される。ウィザードディレクトリはCode::Blocksインストールディレクトリ(C:\Program Files (x86)\CodeBlock)階層下、あるいはユーザーディレクトリ(C:\Users\user)階層下のどちらかである。

  • C:\Program Files (x86)\CodeBlocks\share\CodeBlocks\templates\wizard
  • C:\Users\user\AppData\Roaming\CodeBlocks\share\codeblocks\templates\wizard

前者はCode::Blocks標準添付ウィザード用でユーザーがこれを改変する事は想定されない。後者はユーザーカスタマイズ用で後者の設定が必ず前者に優先する。ウィザードディレクトリのconfig.scriptはRegisterWizards関数内でCode::Blocksにウィザードを登録する。

function RegisterWizards()
{
...
RegisterWizard(wizProject, _T("wxwidgets_k1"), _T("wxWidgets project (K1)"),_T("GUI"));
...
}

上記の例はwxwidgets_k1サブディレクトリをwxWidgets project (K1)という名称でプロジェクトウィザードのGUIカテゴリに登録する。ウィザードとして登録されるサブディレクトリは以下のファイルで構成される。

ファイル名 内容 必要性
logo.png [New from template]ダイアログ一覧に示されるアイコン 必須
wizard.png ウィザードダイアログの左に示されるビットマップ 必須
wizard.script ウィザードスクリプト 必須
wizard.xrc ウィザードダイアログカスタムページのXRCリソース オプション

wxwidgets_k1サブディレクトリは加えて以下のテンプレートファイルを持つ。

ファイル名 内容
template\app.cpp アプリケーションソースコードテンプレート
template\app.h アプリケーションインクルードテンプレート
template\main.cpp メインウィンドウソースコードテンプレート
template\main.h メインウィンドウインクルードテンプレート
template\wx_pch.h プリコンパイル対象インクルードテンプレート
template\resource.rc ウィンドウズリソーステンプレート
template\resource.wxs メインウィンドウwxSmithリソーステンプレート

wxWidgets project (K1)の処理

ウィザードページ

Code::Blocksが適切にカスタマイズされている事を前提に、ウィザードは以下のウィザードページを順次表示する。

ウィザードページ ページID 種類 機能
イントロ WxIntro ビルトイン イントロメッセージの表示
プロジェクトパス ProjectPathPage ビルトイン プロジェクト名とディレクトリの設定
プロジェクトコンフィグ WxConfProject カスタム ターゲットとGUIタイプの設定

プロジェクトコンフィグウィザードページは本サイトの作成したカスタムウィザードページで、そのXRCリソースはwizard.xrcに含まれる。カスタムウィザードページの入力値はCode::Blocks設定ファイル(C:\Users\user\AppData\Roaming\CodeBlocks\default.conf)のXMLエレメントCodeBlocksConfig\scripts\wxwidgets_k1_wizardに記憶され次回デフォルトとなる。

覚え書き
カスタムウィザードページの記憶値を削除する手段はアプリケーションからもスクリプトからも用意されておらずCode::Blocks設定ファイルを直接編集するしかない。
覚え書き
カスタムウィザードページの作成はXRCエディタを必要とする。本サイトは安直にCode::BlocksでwxSmithエディタを利用した。
  • ダミーのウィンドウズデスクトップアプリケーションプロジェクトを作成する。
  • [wxSmith|Add wxPanel]で[New wxPanel resource]ダイアログを開く。
  • [Class Name]に作成するカスタムウィザードページのページIDを入力し、[Header file]と[Source file]は自動生成に任せる。
  • [Xrc File]にチェックし、テキストボックスにwizard.xrcを入力する。[Add XRC file to autoload list]にチェックする。
  • [OK]を押してダイアログを閉じる。
  • 開かれたwxSmithエディタでウィザードダイアログにはめ込まれるパネルを作成する。
  • この手順を必要なカスタムウィザードページ全てに繰り返す。
  • プロジェクトを保存する。
  • プロジェクトディレクトリに作成されたwizard.xrcを、必要とするウィザードサブディレクトリへコピーする。

スクリプト

最後のウィザードページに[Finish]で応えるとウィザードはスクリプト(wizard.script)の各ステップを実行する。wxWidgetsライブラリはデバッグビルド/リリースビルドで切り替える可能性があるためプロジェクトオプションでなくターゲットオプションとする。ただし本サイトがMSYS2で導入するwxWidgetsはリリースバージョンのみで、それぞれに同じ設定を用いる。

  1. 各テンプレートファイルからファイルを生成してプロジェクトに登録 (TMyGenFiles::GetGenFile)
  2. プロジェクトのセットアップ (TMyProject::Setup)
    1. プロジェクトオプションの設定 (TMyProject::_SetupProject)
      1. コンパイラオプションの設定 (TMyProject::_SetupMinGW)
        • コンパイルリンクオプションの設定
        • ウィンドウズAPIライブラリファイルの追加
      2. wxWidgetsのターゲット非依存設定 (TMyProject::_SetupWx)
      3. プリコンパイル済みヘッダの設定 (TMyProject::_SetupPCH)
      4. wxSmithの設定 (TMyProject::_SetupWxSmith)
    2. ウィザードページで選択された全ターゲットのセットアップ (TMyProject::_SetupTargets)
      1. ターゲットの作成 (TMyTarget::constructor)
      2. ターゲットのセットアップ (TMyTarget::Setup)
        • プロジェクトに登録されている各ファイルをターゲットに登録
        • ターゲットタイプと出力ファイルの定義
        • コンパイラオプションの設定
          • デバッグビルド/リリースビルドの設定
          • wxWidgets探索パスの設定
          • wxWidgetsライブラリファイルの追加

wxWidgets project (K1)のカスタマイズ

スクリプトの設定するオプションは全てスクリプトにハードコーディングされている。そのほとんどは実装関数内に記述されるが、カスタマイズされる可能性の高いオプションはスクリプト冒頭でルートテーブルスロット(C++で言うグローバル変数)に代入している。

スロット名 内容 初期設定 備考
g_MyFolder ウィザードサブディレクトリ名 _T("wxwidgets_k1")
g_ProjAuthor [AUTHER_NAME]に置換される文字列 _T("Takeshi Kodama") テンプレートファイル置換処理
g_ProjEmail [AUTHER_EMAIL]に置換される文字列 _T("") テンプレートファイル置換処理
g_ProjWebsite [AUTHER_WWW]に置換される文字列 _T("") テンプレートファイル置換処理
g_PCHMode プリコンパイル済みヘッダ配置 pchSourceDir pchSourceDir, pchObjectDir, pchSourceFile
g_MingwCompilerID32 32ビットコンパイラID GetCompilerFactory()
.GetCompilerIDByName(_T("GNU GCC Compiler (32bit)"))
Code::Blocksコンパイラ名から取得
g_MingwCompilerID64 64ビットコンパイラID GetCompilerFactory()
.GetCompilerIDByName(_T("GNU GCC Compiler (64bit)"))
Code::Blocksコンパイラ名から取得
g_MingwInclude32 32ビット標準インクルードディレクトリ絶対パス _T("$(#mingw32.include)") Code::Blocksグローバル変数
g_MingwLib32 32ビット標準ライブラリディレクトリ絶対パス _T("$(#mingw32.lib)") Code::Blocksグローバル変数
g_MingwInclude64 64ビット標準インクルードディレクトリ絶対パス _T("$(#mingw64.include)") Code::Blocksグローバル変数
g_MingwLib64 64ビット標準ライブラリディレクトリ絶対パス _T("$(#mingw64.lib)") Code::Blocksグローバル変数
g_WxIncludeSubPath wxWidgetsインクルードディレクトリ相対パス _T("wx-3.0") g_MingwIncludeXXからの相対パス
g_WxLibSubPath wxWidgetsライブラリディレクトリ相対パス _T("") g_MingwLibXXからの相対パス
g_WxIncludeFileToCheck wxWidgetsインストール確認用ファイル相対パス _T("wx/wx.h") g_MingwIncludeXXからの相対パス
g_WxLibHasDebugVersion wxWidgetsデバッグバージョン存否 false true, false
g_WxLibNameListDebug デバッグビルド用wxWidgetsライブラリファイルリスト [_T("libwx_mswu_core-3.0.a")
,_T("libwx_baseu-3.0.a")
,_T("libwxtiff-3.0.a")
,_T("libwxjpeg-3.0.a")
,_T("libwxpng-3.0.a")
,_T("libwxzlib-3.0.a")
,_T("liblzma.a")
,_T("libjbig.a")]
g_WxLibIncludeSetupSubPathDebug デバッグビルド用wxWidgetsセットアップインクルードディレクトリ相対パス _T("wx/include/msw-unicode-static-3.0") g_MingwLibXXからの相対パス
g_WxLibNameListRelease リリースビルド用wxWidgetsライブラリファイルリスト [_T("libwx_mswu_core-3.0.a")
,_T("libwx_baseu-3.0.a")
,_T("libwxtiff-3.0.a")
,_T("libwxjpeg-3.0.a")
,_T("libwxpng-3.0.a")
,_T("libwxzlib-3.0.a")
,_T("liblzma.a")
,_T("libjbig.a")]
g_WxLibIncludeSetupSubPathRelease リリースビルド用wxWidgetsセットアップインクルードディレクトリ相対パス _T("wx/include/msw-unicode-static-3.0") g_MingwLibXXからの相対パス

g_ProjAuthorは必ずあなたの名前で書き換える。g_PCHModeは[Project|Properties]の[Project/target options]ダイアログ[Project settings|Precompiled headers|Strategy]を設定する。初期設定のいくつかはCode::Blocksカスタマイズを利用するが、値を直接書き込んでも問題ない。本サイトのwxWidgetsライブラリはリリースバージョンのみでg_WxLibNameListDebugとg_WxLibNameListRelaseは等しい。静的リンクするためlibwxtiff-3.0.a以下のライブラリファイルを必要とする。デバッグバージョンが得られる場合はg_WxLibHasDebugVersionをtrueとする。g_WxLibIncludeSetupSubPathDebugとg_WxLibIncludeSetupSubPathReleaseはwx/setup.hファイルの探索パスを指定する。

ターゲットウィザードに関する追記

wxWidgets project (K1)が使うスクリプトは実験的にターゲットウィザード対応も実装しているが、その使用はあまり推奨しない。

function RegisterWizards()
{
...
RegisterWizard(wizTarget, _T("wxwidgets_k1"), _T("wxWidgets (K1)") ,_T("GUI"));
...
}

標準的なターゲットウィザードはビルトインのBuildTargetPageウィザードページを表示し、ウィザードダイアログを閉じた後にターゲットを作成する。一方、このターゲットウィザードはカスタムウィザードページでターゲットを作成するが、それでもウィザードダイアログが閉じた後にBuildTargetPageの入力(実際は表示されておらず何の入力もされていない)でターゲット作成を試みエラーとなる。このエラーは無害で無視できるが、標準的なターゲットウィザードの振る舞いと大きく異なる。

既存プロジェクトにターゲットを追加する場合は、[Project|Properties]の[Project/target options]ダイアログ[Build targets|Build targets|Duplicate]で既存ターゲットを複製し修正するほうが、ターゲットウィザードを用いるより簡単な事が多い。