一个单文档项目我自己为默认文档添加了一个View当我切换项目自动生成的View(DefaultView)和我添加的这个View(MyView)时:1 如何将MyView自动填充框架空白区域?我是先取得ActiveView(也就是DefaultView)的RECT,将其给MyView,结果上面少一条,把下面的StatusBar盖住了也就是有偏差。2 关键的问题是我的MyView不可以自动充满FrameWnd,也就是切换到显示MyView的时候,把上面几个ControlBar浮起来,MyView尺寸不变。而切回去DefaultView,则一切正常,自动调整尺寸。我想请教大家的是:
我是给框架的ActiveDocument添加的一个View,和默认View类一样,为什么默认生成的View有着和MyView不一样的性能?我想区别具体在哪个地方?呵呵~~~如果谁能帮我把问题1也解决那更好了^^多谢!附我添加View的方法:
CCreateContext* pCrContext = new CCreateContext;
pCrContext->m_pCurrentDoc = this->GetActiveDocument();
pCrContext->m_pNewViewClass = NULL;
pCrContext->m_pCurrentFrame = NULL;
pCrContext->m_pLastView = NULL;
pCrContext->m_pNewDocTemplate = this->GetActiveDocument()->GetDocTemplate();CMyView* pView = new CMyView;
pView->Create(NULL, NULL, WS_CHILD|WS_VISIBLE, rectDefault, this, NULL, pCrContext);

解决方案 »

  1.   

    这个问题我碰到过,在你的正常的View(两个中必有一个正常的)的OnSize()函数中,获取另一个View的指针,如你这里的pView(应该设为CMainFrame的成员变量,局部变量用过就扔,不能实现你的功能的),然后进行窗口大小设置,该函数中增加的参考代码如下:
    CMainFrame *pMainFrame = (CMainFrame*)AfxGetMainWnd();
    if(pMainFrame == NULL || pMainFrame->m_pYourView == NULL)
    return;//m_pYourView不正常的View的指针;
    CRect oThisRect;
    GetWindowRect(oThisRect);
    pMainFrame->ScreenToClient(oThisRect);
    pMainFrame->m_pYourView->MoveWindow(oThisRect, TRUE);这样你的两个问题就可以解决
      

  2.   

    pView->Create(NULL, NULL, WS_CHILD|WS_VISIBLE, rectDefault, this, NULL, pCrContext);
    不要用Create,要用CreateView.
      

  3.   

    参考例子:
    http://www.vckbase.com/document/viewdoc/?id=691
      

  4.   

    多谢大家的热情
    CreateView好象是FrameWnd的方法呀,他好象要求CCreateContext::pNewViewClass不为NULL,俺不会设这个值。谁教我一下~
    fengqinggao(风清高):
    我这2个View是一个类,在OnSize()写是什么意思呢?
      

  5.   

    那个值可以这么赋值:
    pContext->m_pNewViewClass = RUNTIME_CLASS(CMyView);你两个View是同一个派生的,那还不如用一个View,然后根据选择不同更新其中的内容呢,这样结构会更紧凑些如果是同一个类,那确实不好在View类的OnSize()处理,但是可以在CMainFrame的OnSize中处理,将我上面的语句修改一下即可,即先取得正常View的尺寸,然后设置不正常窗口的尺寸
      

  6.   

    MFC经典问答中的源码:
    全局函数,直接调用就行。第一个参数是主框架指针,后一个这样用:RUNTIME_CLASS(CYourNewView)。void SwitchViewInFrame(CFrameWnd *pFrame, CRuntimeClass *pViewClass)
    {
    ASSERT_VALID(pFrame); ASSERT(pViewClass != NULL); ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CView))); CView *pActiveView = pFrame->GetActiveView();
    if(pActiveView == NULL)
    {
    // No active view.
    return;
    } if(pActiveView->IsKindOf(pViewClass))
    {
    // The same view.
    return;
    } CRect rcView;
    pActiveView->GetWindowRect(&rcView); CDocument *pDoc = pActiveView->GetDocument();
    ASSERT_VALID(pDoc); BOOL bSaveAutoDelete = pDoc->m_bAutoDelete;
    pDoc->m_bAutoDelete = FALSE; pActiveView->DestroyWindow(); pDoc->m_bAutoDelete = bSaveAutoDelete; CCreateContext context;
    context.m_pNewDocTemplate = NULL;
    context.m_pLastView = NULL;
    context.m_pCurrentFrame = NULL; context.m_pNewViewClass = pViewClass;
    context.m_pCurrentDoc = pDoc; CView *pNewView = static_cast<CView *>(pFrame->CreateView(&context));
    ASSERT_VALID(pNewView); pFrame->ScreenToClient(&rcView);
    pNewView->MoveWindow(&rcView, TRUE); pFrame->InitialUpdateFrame(pDoc, TRUE);
    }