我用MDI创建了一个工程,用来对图片进行边缘检测处理。
现在要求把窗口用CSplitter分割成6个视图,以便可以
在一个界面下同时对六张图片进行处理和处理结果的比较。目前分割部分已经完成,但是载入图片时只在当前激活(SetActiveView)
的视图中有显示,其他视图没有显示,请问该怎么处理才能
在图片一载入后六个视图都同时显示呢?一下是分割视图的代码:BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// CG: The following block was added by the Splitter Bar component.
if (!m_wndSplitter.CreateStatic(this, 2, 2))
{
TRACE0("Failed to Splitter window\n");
return FALSE;
} // add the first splitter pane - the default view in column 0
if (!m_wndSplitter.CreateView(0, 0,
pContext->m_pNewViewClass, CSize(320, 320), pContext))
{
TRACE0("Failed to create first pane\n");
return FALSE;
} // add the second splitter pane - an input view in column 1

if (!m_wndSplitter.CreateView(0, 1,
RUNTIME_CLASS(CMyFormView), CSize(320, 320),pContext))         //创建多视图
{
TRACE0("Failed to create second pane\n");
return FALSE;
}

if (!m_wndSplitter.CreateView(1, 0,
RUNTIME_CLASS(CMyFormView2), CSize(320, 320),pContext))         //创多双视图
{
TRACE0("Failed to create second pane\n");
return FALSE;
}

if (!m_wndSplitter.CreateView(1, 1,
RUNTIME_CLASS(CMyFormView3), CSize(320, 320),pContext))         //创建多视图
{
TRACE0("Failed to create second pane\n");
return FALSE;
}

// activate the input view
SetActiveView((CView*)m_wndSplitter.GetPane(0,0));                 //激活当前视图

}
}

解决方案 »

  1.   

    我曾用两种方法来解决这个问题,但是都没有效果
    方法一:
    POSITION   pos = GetFirstViewPosition();   

        while(pos != NULL)   
        {   
            CView* pView = GetNextView(pos);   
    CChildFrame *pChild  =  (CChildFrame*)pView->GetParentFrame();//获得该view的父窗口
    //pChild->MDIActivate();
    //pView->GetParentFrame()->GetLastActivePopup()->BringWindowToTop();//激活视图
      

  2.   

    方法二:
    POSITION   pos = GetFirstViewPosition();   

        while(pos != NULL)   
        {   
            CView* pView = GetNextView(pos);   
    if(pView->IsKindOf(RUNTIME_CLASS(CMyFormView)))
    ChangeView(RUNTIME_CLASS(CMyFormView));
    else if(pView->IsKindOf(RUNTIME_CLASS(CMyFormView1)))
    ChangeView(RUNTIME_CLASS(CMyFormView1));
    else if(pView->IsKindOf(RUNTIME_CLASS(CMyFormView2)))
    ChangeView(RUNTIME_CLASS(CMyFormView2));
    else if(pView->IsKindOf(RUNTIME_CLASS(CMyFormView3)))
    ChangeView(RUNTIME_CLASS(CMyFormView3));
    else if(pView->IsKindOf(RUNTIME_CLASS(CMyFormView4)))
    ChangeView(RUNTIME_CLASS(CMyFormView4));
            UpdateAllViews(NULL);   
        }
    void CPicture_SplitDoc::ChangeView(CRuntimeClass *pRTClass)
    {
    CMainFrame * m_mainFrame = (CMainFrame *)AfxGetMainWnd();
    //m_mainFrame->MDIGetActive()->GetActiveDocument()->UpdateAllViews(NULL);

        CChildFrame   *child = (CChildFrame *)m_mainFrame->GetActiveFrame();  

    // 先删除原来的视
    child->m_wndSplitter.DeleteView(0,0);
    // 创建新的视
    CCreateContext Context;
    Context.m_pNewViewClass = pRTClass;   // 视类
    Context.m_pCurrentDoc = m_mainFrame->MDIGetActive()->GetActiveDocument();// 与文档连接
    child->m_wndSplitter.CreateView(0,0,pRTClass,CSize(0,0),&Context);
    CView * pView = (CView *)child->m_wndSplitter.GetPane(0,0);// 获取分割区域
    pView->ShowWindow(SW_SHOW);
    pView->OnInitialUpdate();
    child->SetActiveView(pView);
    //child->m_wndSplitter.SetRowInfo(0,300,20);  // 设置宽度
    ::SetWindowLong(pView->m_hWnd,GWL_ID,AFX_IDW_PANE_FIRST);
    child->m_wndSplitter.RecalcLayout();}
    以上这两种方法都放在图片打开的函数FileOpen()里面,
    目的就是为了逐个视图进行更新,可是都没有效果,
    请问大虾们这该怎么解决???
      

  3.   

    把数据放到C...Doc,打开文件读取后UpdateAllView就可以了。如果要在一个文档中处理多个文件也是可以的,自己管理数据,在UpdateAllView中可以指定参数,View中根据参数决定是否属于自己的数据在OnDraw中绘图。
      

  4.   

    我的数据就是放在CPicture_SplitViewDoc里的,
    FileOpen()也是在CPicture_SplitViewDoc定义的,
    上面的方法中也用到了UpdateAllViews(NULL);
    可是都没效果
      

  5.   

    默认对UpdateAllViews(NULL)只是更新窗口显示而已,具体怎么显示得看你的OnDraw怎么写的。你为什么不在调用UpdateAllViews的时候传递参数?你的视图从那里获得选择的文件信息?