[MSVC] CFormView を利用してビューにコントロールを配置する方法

この記事は、以前は次の ID で公開されていました: JP98598
サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。
概要


CFormView クラスにより、ダイアログ ボックス テンプレートを利用してビューにコントロールを配置することができます。CFormView の基本的な使い方は CFormView クラスのドキュメントに記述されており、MFC サンプル VIEWEX および CHKBOOK において使用例が紹介されていますが、サンプルではフレーム ウィンドウの初期サイズをフォームの初期サイズに合わせる方法が紹介されていません。

以下は、CFormView ベースの SDI または MDI アプリケーションを作成し、フレーム ウィンドウの初期サイズをフォームに合わせ、フレームのスタイルを変更し、フォーム上のボタン押下により MDI ドキュメントをクローズする方法を紹介しています。
詳細

AppWizard により CFormView ベースのアプリケーションを作成

  1. AppWizard を起動。
  2. Visual C++ 1.0 1.51 では [クラス] ボタンにより表示される画面、Visual C++ 2.0 以降では AppWizard ステップ 6/6 でビュークラスを選択し、[基本クラス] コンボ ボックスから CFormView を選択し AppWizard を完了。適切なスタイルが設定されたダイアログ ボックス テンプレート (フォーム) が、リソース ファイルに自動追加されます。
  3. App Studio またはリソース エディタによりフォーム上にプッシュ ボタンを配置。
  4. OnUpdate() メンバ関数をオーバーライドし、CFormView のドキュメントに記述されているように、現在のドキュメントから該当する値によりビュー クラスのメンバ変数を更新して DDX (Dialog Data Exchange) を行わせるために、UpdateData() を呼び出す。

    : UpdateData は仮想関数ではなく、基本クラスを呼び出すことにより派生クラスの DoDataExchange が標準的なポリモーフィズムにより呼び出されることが保証されます。CFormView リファレンスでは、UpdateData をオーバーライドするのではなく、呼び出すよう記述されています。
  5. フォーム ビューの初期サイズを設定する場合、OnInitialUpdate() 関数を以下のようにオーバーライド。SDI/MDI で多少の違いがあります。

    SDI メイン フレームのサイズを変更

    CFormView クラスを利用する SDI アプリケーションのメイン フレーム サイズをフォームのサイズに合わせるには、CFormView の派生クラスを作成し OnInitialUpdate() 関数をオーバーライドします。
          void CMyFormView::OnInitialUpdate()      {         CFormView::OnInitialUpdate();         GetParentFrame()->RecalcLayout();         ResizeParentToFit();      }
    ResizeParentToFit() 関数では、ユーザーによるメイン フレーム ウィンドウのサイズ変更を抑制できません。(必要に応じてスクロールバー表示されます) フォーム ビューの親ウィンドウであるフレーム ウィンドウのスタイルを変更するには、CMainFrame クラスの PreCreateWindow() 関数をオーバーライドします。(Visual C++ 4.0 以降ではスケルトンの状態でオーバーライドされています。)ウィンドウ サイズの変更を抑制したい場合を例にすると、以下のコードになります。
          BOOL CMainFrame::PreCreateWindow(CREATESTRUCT &cs)      {         cs.style &= ~WS_THICKFRAME;         return CFrameWnd::PreCreateWindow(cs);      }

    MDI 子フレームのサイズを変更

    SDI アプリケーションのメイン フレームのサイズ変更と似ていますが、RecalcLayout()を呼び出す必要はありません。フォーム ビューの親となる MDI 子フレームのサイズを変更するには、CFormView の派生クラスで OnInitialUpdate() 関数を以下のようにオーバーライドします。
          void CMDIFormView::OnInitialUpdate()      {         CFormView::OnInitialUpdate();         ResizeParentToFit();      }
    ResizeParentToFit() 関数のデフォルト引数を変更すると、SDI アプリケーションと同様の現象が発生するうえ、子ウィンドウのサイズが大きくなりすぎて MDI メイン フレームや画面全体に収まらなくなることがあります。

    MDI 子フレームのスタイルを変更するには、MDI 子ウィンドウ クラスの派生クラスを作成し、SDI の場合と同じように PreCreateWindow 関数をオーバーライドします。

    ボタンにより MDI フォームをクローズ

    フォーム上に配置したボタンによりドキュメントを閉じるには、ClassWizard により CFormView クラスのボタン オブジェクト ID に対する BN_CLICKED メッセージのメッセージ ハンドラを追加します。オブジェクト ID を誤ると、ClassWizard はメッセージ マップに不適当なエントリを生成し、ボタンに対して不正な関数を生成しますので注意してください。

    以下のコードによりボタン押下のメッセージ ハンドラから [閉じる] コマンドを呼び出せます。
          void CMyForm::OnClickedButton1()      {         PostMessage(WM_COMMAND, ID_FILE_CLOSE);      }
    補足: IsModified() 関数の戻り値が 0 以外の場合ファイル保存の確認を促されます。
関連情報
文書番号 : 401931
タイトル : [VC1x] CFormView を使用したプログラム テクニック
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 98598 (最終更新日 1997-12-12) をもとに作成したものです。

kbfasttips
プロパティ

文書番号:98598 - 最終更新日: 07/21/2003 22:29:27 - リビジョン: 3.0

Microsoft Foundation Class Library 4.2

  • kbhowto vc10 vc15 vc20 vc40 vc41 vc42 vc4x vc50 KB98598
フィードバック