2012-03-15 10 views
2

MFC MDIアプリケーションのドキュメントクラス内の特定のビューに既にアクセスしている場合はアクセスしたいとします。ビューは現在アクティブであるかどうかは不明です。私はビューは常にアクティブであると仮定できる場合、私はMFCで既存の非アクティブなビューを取得する

http://support.microsoft.com/kb/108587

この命令に従うことができますが、ビューは、非アクティブにすることができます。これを行う方法はありますか?

答えて

6

これを行う方法はこれよりも短いですが、ここではまっすぐです。次のコードは、あなたのCMainFrameクラスのメニューハンドラであると仮定します

for(POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition(); pos != NULL;) 
    { 
    CDocTemplate* pTempl = AfxGetApp()->GetNextDocTemplate(pos); 

    for(POSITION pos1 = pTempl->GetFirstDocPosition(); pos1!= NULL;) 
    { 
     CDocument* pDoc = pTempl->GetNextDoc(pos1); 

     for(POSITION pos2 = pDoc->GetFirstViewPosition(); pos2 != NULL;) 
     { 
     CView* pView = pDoc->GetNextView(pos2); 
     if(pView->IsKindOf(RUNTIME_CLASS(...))) 
     { 
      // Do what you need with the view... 
     } 
     } 
    } 
    } 

あなたは基本的には、それに関連付けられたCDocumentsを見て、テンプレートへのポインタを取得する必要があり、それぞれのCDocumentのために、接続されているすべてのビューを横断文書に。

1つのテンプレート、1つのドキュメント、および複数のビューが接続されている場合は、CMainFrameクラスでテンプレートを保存し、AfxGetApp() - > m_pTemplateを呼び出すことでより高速に取得できます。

MFCはいくつかの点でファンキーですが、必要に応じてDoc/Viewアーキテクチャのどの部分にもアクセスできます。

これはあなたが正しい方向にあなたを指し示すことを願っています。

+0

これはおそらく、これを実行する最良の方法だと私は同意します。後でビューポインターが必要になることがわかっている場合は、ビューを作成するときにそのビューを保存し、ビューが破棄されたときにそのビューを削除することもできます。上記の方法よりもはるかに速いので、クラスを表示するために頻繁にアクセスする必要があることがわかってから、これを数回実行しました。 – Redeye

+0

2番目のforループの条件が 'pos1!= NULL'を読み込むのではなく、現在のように' pos!= NULL'ではなく? – aguazales

関連する問題