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

文書翻訳 文書翻訳
文書番号: 98598 - 対象製品
この記事は、以前は次の 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) をもとに作成したものです。

プロパティ

文書番号: 98598 - 最終更新日: 2003年7月21日 - リビジョン: 3.0
この資料は以下の製品について記述したものです。
  • Microsoft Foundation Class Library 4.2?を以下の環境でお使いの場合
    • Microsoft Visual C++ 1.0 Professional Edition
    • Microsoft Visual C++ 1.5 Professional Edition
    • Microsoft Visual C++ 1.51
    • Microsoft Visual C++ 1.52 Professional Edition
    • Microsoft Visual C++ 1.0 Professional Edition
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 5.0 Standard Edition
    • Microsoft Visual C++ 6.0 Service Pack 5
キーワード:?
kbhowto vc10 vc15 vc20 vc40 vc41 vc42 vc4x vc50 KB98598
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"
サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com