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

[MSVC] MFC ベースの MDI 子ウィンドウのタイトルを変更する方法

文書番号: 99182

最終更新日: 2004/03/31


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


概要

この資料は、MFC ベースのアプリケーションで複数文書インターフェイス (以下 MDI) 子ウィンドウのタイトルを変更する一つの方法を紹介したものです。

詳細

タイトルを変更するためには、子フレームの PreCreateWindow およびビューの OnInitialUpdate をオーバーライドする必要があります。
タイトルを変更する場合、『Windows インターフェイス アプリケーション デザイン ガイド』に紹介されている以下の規則に従います。
  ...ドキュメント ウィンドウのタイトル バーには、文書名を表示するタイトル 
  (キャプション) と、コントロール ボックス、最大表示ボタンを含んでいなければ
  なりません。...
以下の手順により MDI 子ウィンドウフレームのタイトルを変更できます。

  1. AppWizard により MDI アプリケーションのスケルトンを作成。(アプリケーション名を仮に MyApp とします。)

    ・Visual C++ 4.0 以降では、子フレームクラスが実装済みなので手順 7 へ進む。
  2. ClassWizard を使い CMDIChildWnd を基本クラスとする新規クラスを作成。(クラス名を仮に CChildFrame とします。)
  3. 統合環境の [プロジェクト] メニュー内のコマンドで依存関係をスキャン。
  4. CMyAppApp::InitInstance 関数で CMultiDocTemplate 関数の第 3 引数を CMDIChildWnd から、新規作成したクラス (CChildFrame) に変更。
  5. 変更したクラス名の参照を解決するため、新規クラス作成時に自動生成されたヘッダー ファイルをインクルード。
  6. 子フレーム クラス (CChildFrame) のヘッダーで以下のプロテクト メンバ関数を宣言。
         virtual BOOL PreCreateWindow(CREATESTRUCT &cs);
    
  7. 追加した関数を以下のように定義。
         BOOL CChildFrame::PreCreateWindow(CREATESTRUCT &cs)
         {
             if(CMDIChildWnd::PreCreateWindow(cs)==0)
                 return FALSE;
             cs.style &= ~(LONG)FWS_ADDTOTITLE;  // タイトルの自動追加を抑制
             return TRUE;
         }
    
  8. ビュー クラス (CMyAppView) のヘッダーで以下のパブリック メンバ関数を宣言。( Visual C++ 4.0 以降では ClassWizard により追加できます。)
         virtual void OnInitialUpdate();
    
  9. 追加した関数を以下のように定義。『Windows インターフェイス アプリケーション デザイン ガイド』に従う内容でカスタマイズしてください。
         void CMyAppView::OnInitialUpdate()
         {
             CView::OnInitialUpdate();
             GetParent()->SetWindowText(GetDocument()->GetTitle()+
              " - This is a test!");
         }
    
  10. プログラムをビルド。
  11. プログラムを実行すると、子ウィンドウのタイトルが "Myapp1 - This is a test!"と表示されます。

注意事項

OnCreate ではなく OnInitialUpdate をオーバーライドする理由は、OnCreate のタイミングではドキュメントが用意されていないため、GetTitle を呼び出しても空文字列が返されるためです。

Visual C++ 1.0 1.51 においては、MDI 子フレームで FWS_ADDTOTITLE がセットされていない時は CMDIChildWnd クラスの m_nWindow メンバ変数がアップデートされません。同一ドキュメントに対して複数のビューを開いている場合は、CDocument::CanCloseFrame をオーバーライドしてください。ドキュメントに対応する最後のビュー以外のビューが閉じられるときに [ファイルの保存] ダイアログ ボックスが表示されるのを抑制できます。

オーバーライドの一例を紹介します。
    BOOL CMyDoc::CanCloseFrame(CFrameWnd* pFrameArg)
    {
        ASSERT_VALID(pFrameArg);
        UINT iCount = 0;

        POSITION pos = GetFirstViewPosition();
        while (pos != NULL)
        {
            CView* pView = GetNextView(pos);
            ASSERT_VALID(pView);
            CFrameWnd* pFrame = pView->GetParentFrame();
            if (pFrame != NULL)
            {
               ASSERT_VALID(pFrame);
               iCount++;
          }
      }
          if ( iCount > 1 )
            return TRUE;

         return SaveModified();
      }

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 99182 (最終更新日 1997-12-12) を基に作成したものです。

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

inserted by FC2 system