クラス: wxDocument, wxView, wxDocTemplate, wxDocManager, wxDocParentFrame, wxDocChildFrame, wxDocMDIParentFrame, wxDocMDIChildFrame, wxCommand, wxCommandProcessor ドキュメント/ビューフレームワークは、多くの種類のアプリケーションをビルドするために要求されるコードを劇的にシンプルにすることができるため、多くのアプリケーションフレームワークで見受けられる。 その考えは、アプリケーションを、データの保存やデータへのインターフェース非依存な操作のためのドキュメントという観点と、視覚化とデータの操作のためのビューという観点でアプリケーションをモデル化することができる。ドキュメントは、与えられたストリームオブジェクトの入出力がどのように扱うかを管理し、ビューは、物理的なウィンドウからの入力受付やドキュメントデータを取り扱う。ドキュメントのデータが変更されれば、全てのビューはその変更を更新すべきである。 フレームワークは、このモデルをベースに、多くのユーザインタフェース要素を提供する。一旦自身のクラスとそれらの関係を定義すれば、フレームワークは、ファイル選択の表示、ファイルクローズ操作、変更を保存するかどうかの問い合わせ、適切な(場合によってはデフォルトの)コードへのメニューコマンドの割り当て、印刷/印刷プレビューやundo/redoでさえも取り扱う。フレームワークは高度にモジュール化されており、デフォルトの動作以上の動作をするよう、関数や変数のオーバーライドや多重定義を認められている。 ドキュメント/ビューフレームワークの元でアプリケーションを作成するために必要な、大まかな手順がある。: + 自身のドキュメントクラスとビュークラスを定義し、最低限のメンバ関数、例えば、入出力、描画や初期化をオーバーライドする。 + ビューで必要とされる幾つかのサブウィンドウ(例えば、スクロールウィンドウ)を定義する。ビューやドキュメントへのイベントを送らなければならず、例えば、OnPaintはwxView::OnDrawへ送られなければならない。 + どのようなウィンドウスタイルを使用するか決定する:MicrosoftのMDI(1つのフレームによって囲まれた複数のドキュメントの子フレーム)、SDI(ドキュメントごとに独立したフレーム)、あるいは、単一ウィンドウ(Window Writeに見られるような、1度に1つのドキュメントが開く) + 適切なwxDocParentFrameとwxDocChildFrameクラスを使用する。wxApp:OnInitでwxDocParentFrameインスタンスを作成し、ビューを初期化するときにwxDocChildFrame(単一ウィンドウで無い場合)を作成する。標準メニュー識別子(wxID_OPEN、wxID_PRINTなど)を使用してメニューを作成する。 + wxApp::OnInitの始めに1つのwxDocManagerインスタンスを作成し、ドキュメントとビューの間の関係を定義するために幾つかのwxDocTemplateインスタンスを定義する。単純なアプリケーションでは、wxDocTemplateはただ1つだけである。 undo/redoを実装したい場合には、wxCommandを自身のクラスに継承し、直接コードを実行するのではなく、wxCommandProcessor::Submitを使用する。フレームワークは、wxID_UNDO とwxID_REDOメニューアイテムがビューメニューで定義されている場合には、必要に応じてundo/redoの関数を呼ぶことを管理する。 デフォルトのフレームワーク動作を超えて使用するための例を挙げる。: * 異なるundo/redoやコマンド履歴エディタを定義するために、wxDocument::OnCreateCommandProcessorをオーバーライドする。 * 複数ページのドキュメントを使用するために、継承されたwxPrintoutクラスのインスタンスを作成しwxView::OnCreatePrintoutをオーバーライドする。 * 異なるファイルセレクタを使用するために、wxDocManager::SelectDocumentPathをオーバーライドする。 * 開くことができるドキュメントの最大数とundoコマンドの最大数を制限する。 フレームワーク機能を起動する際に特筆すべきは、メニューで既に定義されたwxWidgetsのコマンド識別子の幾つか、または、全てを使用する必要がある、ということである。 wxPerl note: The document/view framework is available in wxPerl. To use it, you will need the following statements in your application code: use Wx::DocView; use Wx ':docview'; # import constants (optional) ---- !!!wxDocument概要 クラス: wxDocument wxDocumentクラスは、アプリケーションのファイルベースデータの雛形を作るために使用される。それは、wxView, wxDocTemplateとwxDocManagerクラスと共にwxWidgetsでサポートされているドキュメント/ビュー フレームワークの一部である。 一連のメニューコマンド(オープン、保存、Save-asなど)が自動的にサポートされるため、このフレームワークを使用することにより、多くのユーザインタフェースプログラムを省略することができる。プログラマは、フレームワークのために、最小限のクラスとメンバ関数を必要に応じて定義するだけである。データと、データを表示・編集することの意味は、このモデルでは、明確に切り分けられており、また、同じデータに対して複数のビューを持つ概念がサポートされている。 ドキュメント/ビューモデルは、多くのアプリケーションに適用できるが、全てのアプリケーションに向いている訳ではない。例えば、ビュー関連の関数を呼び出すことが無かったり、ファイルのオープン、編集、保存などの機能が不要な、単純なファイル変換ユーティリティである。しかし、恐らく大部分のアプリケーションはドキュメントベースである。 See the example application in samples/docview. wxDocument抽象クラスを使用するために、新しい派生クラスを作成し、少なくともメンバ関数SaveObjectとLoadObjectをオーバーライドしなければならない。SaveObjectとLoadObjectは、ドキュメントを保存、または読み込む際にフレームワークから呼ばれる。 フレームワークに対して、要求に応じてドキュメントオブジェクトを作成することを許可するために、マクロDECLARE_DYNAMIC_CLASS、及びIMPLEMENT_DYNAMIC_CLASSを使用する。アプリケーションの初期化でwxDocTemplateオブジェクトを作成するときに、wxDocTemplateクラスがwxDocumentインスタンスの作成方法を知り得るよう、wxDocTemplateコンストラクタの引数にCLASSINFO(YourDocumentClass)を渡さなければならない。 ドキュメントオブジェクトを動的に作成する方法でwxWidgetsを使用したくない場合には、wxDocTemplate::CreateDocumentを適切なクラスのインスタンスを返すようにオーバーライドしなければならない。 !!!wxView概要 クラス: wxView wxViewクラスは、アプリケーションのファイルベースデータの要素の表示や編集をモデル化するために使用される。wxDocument, wxDocTemplate, wxDocManagerと共に、wxWidgetsでサポートされているドキュメント/ビューフレームワークの一部である。 See the example application in samples/docview. wxView抽象クラスを使用するために、新しい派生クラスを作成し、少なくともメンバ関数OnCleate, OnDraw, OnUpdate, 及びOnCloseをオーバーライドしなければならない。ビューに含まれるフレームからにメニューコマンドに対応するOnMenuCommandをオーバーライドする場合があるかもしれない。 フレームワークに対して、要求に応じてビューオブジェクトを作成することを許可するために、マクロDECLARE_DYNAMIC_CLASS、及びIMPLEMENT_DYNAMIC_CLASSを使用する。アプリケーションの初期化でwxDocTemplateオブジェクトを作成する際、wxViewインスタンスを作成する方法をwxDocTemplateが知り得るよう、wxDocTemplateコンストラクタの引数にCLASSINFO(YourViewClass)を渡す必要がある。 ビューオブジェクトを動的に作成する方法でwxWidgetsを使用したくない場合には、適切なクラスのインスタンスを返すようwxDocTemplate::CreateViewをオーバーライドしなければならない。 !!!wxDocTemplate概要 クラス: wxDocTemplate wxDocTemplateクラスは、ドキュメントクラスとビュークラスの間の関係をモデル化するために使用される。アプリケーションは、ドキュメント/ビューの対ごとにドキュメントテンプレートオブジェクトを作成する。ドキュメントテンプレートのリストは、ドキュメントとビューを作成するときに使用されるwxDocManagerインスタンスにより管理される。各ドキュメントテンプレートは、ドキュメント/ビューの組み合わせに対して、ファイルフィルターとデフォルト拡張子に何が適切か、また、どのようにドキュメントやビューを作成するのかを把握している。 例えば、行単位のリストを読み込み・保存するようなアプリケーションを作成しようとしたとする。データに対して2つのビュー(グラフィックと行のリスト)がある場合、1つのドキュメントクラスDoodleDocumentと、2つのビュークラス(DoodleGraphicViewとDoodleListView)を作成する。さらに、2つのドキュメントテンプレートを作成する。1つはグラフィック、もう1つはリストビューのためのものである。そして、両方のドキュメントテンプレートに対し、1つの同じドキュメントクラスとデフォルト拡張子を渡すが、異なるビュークラスを渡す。ユーザがオープンメニューをクリックすると、ファイル選択ダイアログが可能なファイルフィルタ(各wxDocTemplateに対して1つ)のリスト共に表示される。wxDocTemplateを選択するようなフィルタを選択し、あるファイルが選択されると、そのテンプレートはドキュメントとビューを作成する。 アプリケーションが1つのドキュメントと1つのビューを持つ場合、1つのドキュメントテンプレートが作成され、ダイアログは適当に簡略化される。 wxDocTemplateは、wxView, wxDocument,及びwxDocManagerクラスと共に、wxWidgetsでサポートされているドキュメント/ビューフレームワークの一部である。 See the example application in samples/docview. wxDocTemplateクラスを使用するために、新しい派生クラスは必要ない。動的なインスタンス生成を許可するために、CLASSINFO(YourDocumentClass)とCLASSINFO(YourViewClass)を含めて、関連する情報をコンストラクタに渡すだけである。動的にドキュメントオブジェクトを作成する方法でwxWidgetsを使用したくない場合には、適切なクラスのインスタンスを返すようにwxDocTemplate::CreateDocumentとwxDocTemplate::CreateViewをオーバーライドしなければならない。 注意:ドキュメントテンプレートは、C++テンプレートとは無関係である。 !!!wxDocManager概要 クラス: wxDocManager wxDocManagerクラスは、wxView, wxDocument, 及びwxDocTemplateクラスと共に、wxWidgetsでサポートされているドキュメント/ビューフレームワークの一部である。 wxDocManagerインスタンスはドキュメント、ビュー、及びドキュメントテンプレートを統合する。ドキュメントとテンプレートのインスタンスを保持し、ファイルダイアログなどの多くの機能はこの変数を通じて行われる。アプリケーションは、このクラスを'そのまま'使用するか、クラスを継承して機能の拡張や変更のために幾つかのメンバ関数をオーバーライドすることができす。ドキュメント、ビュー、及びテンプレートを使用する前に、アプリケーション初期化の初期の部分でこのクラスのインスタンスを作成する必要がある。 1つのアプリケーションで、複数のwxDocManagerインスタンスを持つことも可能である。 See the example application in samples/docview. !!!wxCommand概要 クラス: wxCommand, wxCommandProcessor wxCommandは、メニューの選択、ツールバーボタンのクリック、データやビューを変更するためにアプリケーションによって用意されたような、アプリケーションコマンドを形成するための基本クラスである。 アプリケーションの機能を、読みにくい、あるいはメンテナンスしにくい方法で関数化したりswitch文で分散させるよりも、コマンド機能をフレームワークやアプリケーションにより扱えるオブジェクトとして明示的に表現したほうが良い。ユーザインタフェースイベントが発生すると、アプリケーションはwxCommandProcessorに対して実行やストアするようなコマンドを発行する。 wxWidgetsのドキュメント/ビューフレームワークは、wxCommandオブジェクトとwxCommandProcessorオブジェクトを使用することにより、UndoとRedoを操作する。コマンドをストア、ロード、リプレイするようなマクロ機能を実装するなど、より進んだwxCommandの使用方法を見つけるかもしれない。 アプリケーションは、コマンドごとに新しいクラスを継承したり、あるいは、整数型や文字列型のコマンド識別子を引数として1つのクラスだけ使用することもできる。 !!!wxCommandProcessor概要 クラス: wxCommandProcessor, wxCommand wxCommandProcessorは、wxCommandインスタンスの履歴を管理するクラスであり、undo/redoを機能的に内蔵している。異なる動作をさせたい場合には、このクラスを継承させること。 !!!wxFileHistory概要 クラス: wxFileHistory, wxDocManager wxFileHistoryは、最後に使用した幾つかのファイルを記録する機能をカプセル化し、ユーザに対して、ファイルメニューに追加された使用したことのあるファイルを素早くロードできるようにする。 wxFileHistoryはwxDocManagerにより使用されるが、独立に使用される事もできる。ファイルのスクロールリストをポップアップ表示したり、異なる動作をさせたい場合には、このクラスを継承させても良い。 wxFileHistory::FileHistoryUseMenuを呼ぶことにより、ファイル履歴とファイルメニューを関連付けることができる。wxID_FILE1からwxID_FILE9の範囲で、メニュー識別子を使用することができる。 これら識別子のうち1つのファイルロードコマンドに応答するために、イベントハンドらを使用してそれら識別子を操作する必要がある。例えば: BEGIN_EVENT_TABLE(wxDocParentFrame, wxFrame) EVT_MENU(wxID_EXIT, wxDocParentFrame::OnExit) EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, wxDocParentFrame::OnMRUFile) END_EVENT_TABLE() void wxDocParentFrame::OnExit(wxCommandEvent& WXUNUSED(event)) { Close(); } void wxDocParentFrame::OnMRUFile(wxCommandEvent& event) { wxString f(m_docManager->GetHistoryFile(event.GetId() - wxID_FILE1)); if (f != "") (void)m_docManager->CreateDocument(f, wxDOC_SILENT); } !!!wxWidgets定義済みコマンド識別子 アプリケーションのメニューとドキュメント/ビューフレームワークとの間のコミュニケーションのために、幾つかのコマンド識別子がメニューの中で定義されている。フレームワークは、その識別子を認識し、wxFrame::OnMenuCommandから(または、ツールバーや、その他のユーザインタフェースから)コマンドが転送された時にそのコマンドを実行する。 * wxID_OPEN (5000) * wxID_CLOSE (5001) * wxID_NEW (5002) * wxID_SAVE (5003) * wxID_SAVEAS (5004) * wxID_REVERT (5005) * wxID_EXIT (5006) * wxID_UNDO (5007) * wxID_REDO (5008) * wxID_HELP (5009) * wxID_PRINT (5010) * wxID_PRINT_SETUP (5011) * wxID_PREVIEW (5012)