次の方法で共有


シングル ドキュメントへのマルチ ビューの追加

Microsoft Foundation Class の (MFC) のライブラリで作成されたシングル ドキュメント インターフェイス ((SDI) アプリケーションでは、各ドキュメント型は一つのビューの型に関連付けられます。場合によっては、新しいビューのドキュメントの現在のビューを切り替える機能を使用することをお勧めします。

ヒントヒント

単一ドキュメントの複数のビューで追加の手順では、 CDocument::AddViewCollect の MFC サンプルを参照してください。

新しい CViewを追加して、既存の MFC アプリケーションにビューを動的に切り替えるにはの派生クラス、追加コードこの機能を実行できます。

各ステップは次のとおりです。

  • 既存のアプリケーションのクラスを変更します。

  • 新しいビュー クラスを作成し、変更します。

  • 新しいビューを作成し、接続します。

  • スイッチ機能を実装します。

  • ビューを切り替える対するサポートを追加します。

このトピックの剰余は、次を前提としています:

  • CWinApp名前の派生オブジェクトは CMyWinAppであり、 CMyWinApp は MYWINAPP.H と MYWINAPP.CPP で宣言および定義されます。

  • CNewView は、新しい名前です CViewの派生オブジェクトと CNewView は NEWVIEW.H と NEWVIEW.CPP で宣言および定義されます。

既存のアプリケーションのクラスを変更します。

ビューを切り替えたりのアプリケーションでは、ビュー、およびそれらを切り替えるには、メソッドを格納するためにメンバー変数を追加してアプリケーションのクラスを変更する必要があります。

MYWINAPP.H の CMyWinApp の宣言に次のコードを追加します:

CView* m_pOldView;
CView* m_pNewView;
CView* SwitchView( );

現在のビューに新しいメンバー変数、 m_pOldView と m_pNewView、ポイントと新しく作成されたもの。ユーザーによって要求された場合、新しいメソッド (SwitchView)は、ビューを切り替えます。メソッド本体は スイッチ機能を実装します。、このトピックで後述します。

アプリケーション クラスに対する直前の変更は、スイッチ機能で使用される Windows メッセージ (WM_INITIALUPDATE)を定義する新しいヘッダー ファイルが必要です。

MYWINAPP.CPP の次のセクションに次の行を挿入します:

#include <AFXPRIV.H>

変更を保存し、次の手順に進みます。

新しいビュー クラスを作成し、変更します。

新しいビュー クラスを作成すると、クラス ビューから使用できる New Class コマンドを使用して簡単になります。このクラスの唯一の要件は CViewから派生することです。アプリケーションにこの新しいクラスを追加します。プロジェクトへの新しいクラスを追加するには、固有の情報については、 クラスの追加を参照してください。

プロジェクトにクラスを追加する場合は、一部のビュー クラスのメンバーのアクセシビリティを変更する必要があります。

protected からコンストラクターとデストラクターの Public,パブリック,public へアクセス指定子を変更することで NEWVIEW.H を変更します。これは、表示される前にクラスが、変更するようにビューの外観を動的に作成したり破棄されします。

変更を保存し、次の手順に進みます。

新しいビューを作成し、接続します。

新しいビューを作成し、接続するには、アプリケーションのクラスの InitInstance の関数を変更する必要があります。変更は新しいビュー オブジェクトを作成し、 2 種類の既存のビュー オブジェクトで m_pOldView と m_pNewView の両方を初期化する新しいコードを追加します。

新しいビューが InitInstance 関数内で、新しいクラスと作成されるため、ビューはアプリケーションの有効期間に保持されます。ただし、アプリケーションは簡単にとして新しいビューを動的に作成できます。

ProcessShellCommandに呼び出しの後でこのコードを挿入します:

CView* pActiveView = ((CFrameWnd*) m_pMainWnd)->GetActiveView();
m_pOldView = pActiveView;
m_pNewView = (CView*) new CNewView;
if (NULL == m_pNewView)
   return FALSE;

CDocument* pCurrentDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument();

// Initialize a CCreateContext to point to the active document.
// With this context, the new view is added to the document
// when the view is created in CView::OnCreate().
CCreateContext newContext;
newContext.m_pNewViewClass = NULL;
newContext.m_pNewDocTemplate = NULL;
newContext.m_pLastView = NULL;
newContext.m_pCurrentFrame = NULL;
newContext.m_pCurrentDoc = pCurrentDoc;

// The ID of the initial active view is AFX_IDW_PANE_FIRST.
// Incrementing this value by one for additional views works
// in the standard document/view case but the technique cannot
// be extended for the CSplitterWnd case.
UINT viewID = AFX_IDW_PANE_FIRST + 1;
CRect rect(0, 0, 0, 0); // Gets resized later.

// Create the new view. In this example, the view persists for
// the life of the application. The application automatically
// deletes the view when the application is closed.
m_pNewView->Create(NULL, _T("AnyWindowName"), WS_CHILD, rect, m_pMainWnd, viewID, &newContext);

// When a document template creates a view, the WM_INITIALUPDATE
// message is sent automatically. However, this code must
// explicitly send the message, as follows.
m_pNewView->SendMessage(WM_INITIALUPDATE, 0, 0);

変更を保存し、次の手順に進みます。

スイッチ機能を実装します。

前の手順では、新しいビュー オブジェクトを作成して初期化するコードを追加します。最後のメイン ピースが遷移のメソッド、 SwitchViewを実行することです。

アプリケーション クラス (MYWINAPP.CPP)の実装ファイルの末尾に、次のメソッド定義を追加します:

CView* CMyWinApp::SwitchView( )
{
   CView* pActiveView = ((CFrameWnd*) m_pMainWnd)->GetActiveView();

   CView* pNewView = NULL;
   if(pActiveView == m_pOldView)
      pNewView = m_pNewView;
   else
      pNewView = m_pOldView;

   // Exchange view window IDs so RecalcLayout() works.
   #ifndef _WIN32
   UINT temp = ::GetWindowWord(pActiveView->m_hWnd, GWW_ID);
   ::SetWindowWord(pActiveView->m_hWnd, GWW_ID, ::GetWindowWord(pNewView->m_hWnd, GWW_ID));
   ::SetWindowWord(pNewView->m_hWnd, GWW_ID, temp);
   #else
   UINT temp = ::GetWindowLong(pActiveView->m_hWnd, GWL_ID);
   ::SetWindowLong(pActiveView->m_hWnd, GWL_ID, ::GetWindowLong(pNewView->m_hWnd, GWL_ID));
   ::SetWindowLong(pNewView->m_hWnd, GWL_ID, temp);
   #endif

   pActiveView->ShowWindow(SW_HIDE);
   pNewView->ShowWindow(SW_SHOW);
   ((CFrameWnd*) m_pMainWnd)->SetActiveView(pNewView);
   ((CFrameWnd*) m_pMainWnd)->RecalcLayout();
   pNewView->Invalidate();
   return pActiveView;
} 

変更を保存し、次の手順に進みます。

ビューを切り替える対するサポートを追加します。

最後の手順は、アプリケーションがビューを切り替える必要がある場合 SwitchView のメソッドをダイヤルするコードを追加することです。これは、複数の方法で実行できます: ユーザーの新しいメニュー項目を内部的に追加するか、ビューを選択するように切り替えることで、特定の条件を満たす場合。

新しいメニュー項目とコマンド ハンドラー関数の追加の詳細については、 コマンドとコントロール通知のハンドラーを参照してください。

参照

概念

ドキュメント/ビュー アーキテクチャ