在MFC中获取现有但非活动的视图

时间:2012-03-15 18:42:00

标签: view mfc

假设我想在MFC MDI应用程序中的doc类中访问特定视图(如果已经打开)。视图当前是否有效。如果我可以假设视图始终处于活动状态,我可以按照此说明进行操作

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

但视图也可以是非活动的。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:7)

有更短的方法可以做到这一点,但这是直截了当的方式。假设以下代码是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...
        }
      }
    }
  }

您基本上必须获取指向模板的指针,查看与其关联的CD文档,并为每个CD文档遍历附加到文档的所有视图。

如果您只使用一个模板,一个文档和多个视图附加,您可以将模板保存在CMainFrame类中,并通过调用AfxGetApp() - > m_pTemplate来更快地获得它。

MFC在某些方面很时髦,但如果需要,它可以让你进入Doc / View架构的任何部分。

希望这能指出你正确的方向。