是这样.在菜单中选择"打开",打开一个图片文件,调用CWinApp::OpenDocumentFile("...", FALSE),传递FALSE参数,是为了不打开新的子窗口,但这时已经打开了一个文档,只是将打开的图片柄保存在CDocument的一个成员变量中.并且在CView里也添加了绘制图像的代码.
问题是如何响应一个菜单命令,来打开一个子窗口来显示图片?
也不知道我说清楚没有.

解决方案 »

  1.   

    创建一个View
    调用
    CDocument::AddView
    然后CDocument::UpdateAllViewsMSDN AddView的例子:SDI的,对MDI改一改应该也有用:// The following example toggles two views in an SDI (single document
    // interface) frame window. A design decision must be made as to
    // whether to leave the inactive view connected to the document,
    // such that the inactive view continues to receive OnUpdate
    // notifications from the document. It is usually desirable to
    // keep the inactive view continuously in sync with the document, even 
    // though it is inactive. However, doing so incurs a performance cost,
    // as well as the programming cost of implementing OnUpdate hints.
    // It may be less expensive, in terms of performance and/or programming,
    // to re-sync the inactive view with the document only with it is 
    // reactivated. This example illustrates this latter approach, by 
    // reconnecting the newly active view and disconnecting the newly 
    // inactive view, via calls to CDocument::AddView and RemoveView.BOOL CMainFrame::OnViewChange(UINT nCmdID)
    // There is an ON_COMMAND_RANGE message map entry associated with
    // OnViewChange:
    // ON_COMMAND_RANGE( ID_VIEW_VIEW1, ID_VIEW_VIEW2, OnViewChange)
    {
     CView* pViewAdd;
     CView* pViewRemove;
     CDocument* pDoc = GetActiveDocument(); if((nCmdID == ID_VIEW_VIEW1) && (m_currentView == 1))
        return;
     if((nCmdID == ID_VIEW_VIEW2) && (m_currentView == 2))
       return; if (nCmdID == ID_VIEW_VIEW2)
     {
      if (m_pView2 == NULL)
      {
       m_pView1 = GetActiveView();
       m_pView2 = new CMyView2;//Note that if OnSize has been overridden in CMyView2 
    //and GetDocument() is used in this override it can 
    //cause assertions and, if the assertions are ignored,
    //cause access violation.
      
       m_pView2->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
          rectDefault, this, AFX_IDW_PANE_FIRST + 1, NULL);
      }
       pViewAdd = m_pView2;
       pViewRemove = m_pView1;
       m_currentView= 2;
     }
     else
     {
      pViewAdd = m_pView1;
      pViewRemove = m_pView2;
      m_currentView= 1;
     }
         
    // Set the child i.d. of the active view to AFX_IDW_PANE_FIRST,
    // so that CFrameWnd::RecalcLayout will allocate to this 
    // "first pane" that portion of   the frame window's client area 
    // not allocated to control   bars.  Set the child i.d. of the 
    // other view to anything other than AFX_IDW_PANE_FIRST; this
    // examples switches the child id's of the two views. int nSwitchChildID = pViewAdd->GetDlgCtrlID();
     pViewAdd->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
     pViewRemove->SetDlgCtrlID(nSwitchChildID); // Show the newly active view and hide the inactive view. pViewAdd->ShowWindow(SW_SHOW);
     pViewRemove->ShowWindow(SW_HIDE); // Connect the newly active view to the document, and
     // disconnect the inactive view.
     pDoc->AddView(pViewAdd);
     pDoc->RemoveView(pViewRemove); SetActiveView(pViewAdd);
     RecalcLayout();
    }
      

  2.   

    没有。
    CWinApp::OpenDocumentFilevirtual CDocument* OpenDocumentFile(
       LPCTSTR lpszFileName 
    );
    没看到你说的FALSE参数啊。