首先,  请问如何做到创建子窗口,现在我是调用App类的OnFileNew方法得到子窗口的。
然后再调用子窗口的ShowWindow(SW_HIDE)将其隐藏,这种效果让人很不满意。
而且调用OnFileNew只能创建即定的view作为CChildFrame的子窗口,不能指定view。
有谁对MDI窗口控制比较熟悉的,给点相关资料和指导好吗?

解决方案 »

  1.   

    那本《深入浅出MFC》讲得很透彻;另外你的需求不是很清晰。视图就是给人看得,为什么要隐藏?你打算在程序中用几种 视图类型?这些都是什么作用,是不是非要通过OnFileNew之类的系统功能产生?
    如果你觉得显示的时机不到,干脆就不要生成它好了。
      

  2.   

    楼主的意思是如果实现不通过系统的OnFileNew方法打开子窗口,也就是:
    如果有一个视图(叫MyView吧)要通过自已建立的[菜单1]显示出来.如果又有另一个视图(MyView2)要通过点击自已建立的[菜单2]显示出来.该如何做?
    (因为直接用OnFileNew系统打开的是已定的视图,如果有多个视图运行时会让你选择,而自已选择性的打开指定的视图就是楼主想要的),隐藏的问题在这里反而不重要了,只要ShowWindow(SW_HIDE);就可以了.
      

  3.   

    创建不同的视图,生成不同的模板,但别调用AddDocTemplate,如:
    pDocTemplate = new CMultiDocTemplate(
    IDR_MULTIDTYPE,
    RUNTIME_CLASS(CMultiDocTestDoc),
    RUNTIME_CLASS(CChildFrame), // custom MDI child frame
    RUNTIME_CLASS(CMultiDocTestView));
    AddDocTemplate(pDocTemplate);//不要这一行也成 m_pMyDocTemplate = new CMultiDocTemplate(
    IDR_MULTIDTYPE,
    RUNTIME_CLASS(CMultiDocTestDoc),
    RUNTIME_CLASS(CChildFrame), // custom MDI child frame
    RUNTIME_CLASS(CMyFrmView));
    // AddDocTemplate(m_pMyDocTemplate);这一行不能要然后在你的某菜单或其它事件中添加,如:
    CMDIChildWnd* pActiveChild = MDIGetActive();
    CDocument* pDocument;
    if (pActiveChild == NULL ||
      (pDocument = pActiveChild->GetActiveDocument()) == NULL)
    {
    TRACE0("Warning: No active document for WindowNew command.\n");
    AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
    return;     // command failed
    } // otherwise we have a new frame !
    CDocTemplate* pTemplate = ((CMultiDocTestApp*)AfxGetApp())->m_pMyDocTemplate;
    ASSERT_VALID(pTemplate);
    CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);
    if (pFrame == NULL)
    {
    TRACE0("Warning: failed to create new frame.\n");
    return;     // command failed
    } pTemplate->InitialUpdateFrame(pFrame, pDocument);
    它就显示出来了,否则就不显示了
      

  4.   

    楼上的大哥我在程序中这样处理的:
    BOOL CEasyAccApp::InitInstance()
    {
    {
        CMultiDocTemplate* pCtlCenterDocTemplate = new CMultiDocTemplate(
    IDR_CTLCENTER_TMPL,
    RUNTIME_CLASS(CEasyAccDoc),
    RUNTIME_CLASS(CChildFrame),
    RUNTIME_CLASS(CCtlCenter));
    //AddDocTemplate(pCtlCenterDocTemplate);这个注释掉 CMultiDocTemplate* pDocTemplate;
    pDocTemplate = new CMultiDocTemplate(IDR_EasyAccTYPE,
    RUNTIME_CLASS(CEasyAccDoc),
    RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
    RUNTIME_CLASS(CEAFromView));
    if (!pDocTemplate)
    return FALSE;
    AddDocTemplate(pDocTemplate);.....后面的代码略(注:后面还有一个
    这样处理后点击新建就只会打开后面那个CEAFromView了,不用再选择视图.
    但是我新建一个菜单并映射后:
    void CMainFrame::OnCtlcenter()
    {
    CMDIChildWnd* pActiveChild = MDIGetActive();
    CDocument* pDocument;
    if (pActiveChild == NULL ||
      (pDocument = pActiveChild->GetActiveDocument()) == NULL)
    {
    TRACE0("Warning: No active document for WindowNew command.\n");
    AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
    return;     // command failed
    } // otherwise we have a new frame !
    CDocTemplate* pTemplate =((CEasyAccApp*)AfxGetApp())-> m_pCtlCenterDocTemplate;
    ASSERT_VALID(pTemplate);
    CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);
    if (pFrame == NULL)
    {
    TRACE0("Warning: failed to create new frame.\n");
    return;     // command failed
    } pTemplate->InitialUpdateFrame(pFrame, pDocument);
    }程序编译时总报错说m_pCtlCenterDocTemplate不是CEasyAccApp的成员,改了好多次,都调试不成功,也就是这一句不知应该怎么设:
    CDocTemplate* pTemplate =((CEasyAccApp*)AfxGetApp())-> m_pCtlCenterDocTemplate;我将这个菜单命令映射到mianframe里对不对啊?如果不对应如何处理,谢谢您!!!