KTxtEditプロジェクトを作成しCode::Blocksのウィザードでスケルトンを生成する。
プログラミング手順
- プロジェクトの作成
- リポジトリ更新とビルドテスト
プロジェクトの作成
動作確認(1)を参考に、C:\Users\user\MinGW\SampleディレクトリにSample.workspaceという名称のワークスペースファイルを作成する。ファイルが既存ならワークスペースとして開く。全てのサンプルプログラムはこのワークスペースで開発する。動作確認(4)を参考に、wxWidgets project (K2)ウィザードを起動してフレームベースのKTxtEditプロジェクトをC:\Users\user\MinGW\Sampleディレクトリに作成する。
- 覚え書き
- Code::Blocksが20.03にアップデートされて以降、Code::Blocks起動直後にwxWidgets project (K2)ウィザードを実行すると高い確率でクラッシュする。その場合、既存ワークスペースを開いてからウィザードを実行すれば多くの場合回避できる。
リポジトリ更新とビルドテスト
動作確認(4)を参考にGit for WindowsでKTxtEditプロジェクトのリポジトリを作成し、Sourcetreeでdevelopブランチを作成する。必要ならビルド実行を確認する。
UMLクラス図
簡略したUMLクラス図でアプリケーションの構成を説明する。
- アプリケーション(KTxtEditAppインスタンス)はメインウィンドウ(KTxtEditFrameインスタンス)を作成して起動する。
- メインウィンドウは子ウィンドウ(コントロール)としてメニューバー(wxMenuBarインスタンス)とステータスバー(wxStatusBarインスタンス)を持つ。
- ユーザーがメニューバーからメニュー項目(wxMenuItemインスタンス)を選択すると対応イベント(wxCommandEventインスタンス)を送出する。メインウィンドウはイベントを捕捉して必要な処理を行う。
- 覚え書き
- イベントは動的には送出/捕捉する。静的には出版/購読とするのが正統らしいが、サイト作成者のイメージに合わず公開/登録と記述する。
より正確なUMLクラス図
先のクラス図は直感的な理解を目的に大きく簡略し、むしろオブジェクト図に近い。クラス図としてより正解に記述すれば以下となる。以下における"所有"とは、所有オブジェクトが解体時に被所有オブジェクトを解体する関係として定義する。
- アプリケーション(KTxtEditApp)とメインウィンドウ(KTxtEditFrame)の関係はそれぞれの基底クラス(wxAppとwxTopLevelWindow)で実装され、派生クラスは直接関係しない。
- メインウィンドウは親ウィンドウとして子ウィンドウを所有する。子ウィンドウは自らを親ウィンドウとしてさらに子ウィンドウを所有する事ができる。
- 親ウィンドウはウィンドウ(wxWindow派生)である。
- 子ウィンドウはコントロール(wxControl派生)あるいはトップレベルウィンドウ(wxTopLevelWindow派生、より厳密にはwxNonOwnedWindow派生)であり、コンストラクタあるいはCreateメンバ関数の第一実引数で親ウィンドウを指定する。
- メインウィンドウは第一実引数ヌルで作成して親ウィンドウが無くEVT_CLOSEハンドラで自らを解体する。
- 親ウィンドウと子ウィンドウの所有関係は共通の基底クラス(wxWindow)で実装され、親ウィンドウはリストで子ウィンドウを保持する。両者の関係は統語論(シンタックス)でクラス再帰の集約になる。
- メインウィンドウの基底wxWindowはステータスバー(wxStatusBar)を子ウィンドウとして所有する。他にコントロール/トップレベルウィンドウを追加すれば同様に所有する。
- メインウィンドウはステータスバーのポインタをメンバ変数(StatusBar1)に保持して直接操作する。両者の関係は意味論(セマンティクス)でコンポジションと言える。
- メニューバー(wxMenuBar)はwxWindow派生だがwxWindow所有関係に属せずメインウィンドウの基底フレーム(wxFrame)がSetMenuBarメンバ関数で所有する。
- フレームはSetStatusBarメンバ関数でステータスバーを自らに関連付けるが、これは所有関係を定義しない。本例で使用しないツールバー(wxToolBar)とSetToolBarメンバ関数も同様である。
- 覚え書き
- GUIライブラリの"所有"と"親子"の定義は揺れ、上述した寿命管理の上下関係、あるいはコンテナと部品の関係を指す。"所有"と"親子"は大抵ほぼ同じ概念を指すが、明確に区別するGUIライブラリも存在する。本サイトは"所有"を主に寿命管理の上下関係として用いる。