本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

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

文書番号: 98598

最終更新日: 2003/07/21


この資料は以下の製品について記述したものです。


この記事は、以前は次の 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) をもとに作成したものです。


Additional query words: kbfasttips

Keywords: KBHOWTO VC10 VC15 VC20 VC40 VC41 VC42 VC4x VC50 KB98598
Technology: kbAudDeveloper kbMFC kbvc100 kbvc150 kbVC151 kbVC152 kbVC16bitSearch kbVC200 kbVC210 kbVC32bitSearch kbVC500 kbVC500Search kbVC600 kbVCsearch

inserted by FC2 system