我用MFC 生成了一个多文档框架,
想要在执行自己定义的命令时,
能出现一个自已生成的窗口.

解决方案 »

  1.   

    让你的窗口对象Create并且ShowWindow
      

  2.   

    使用Winapp 基类还是 frame 基类.
      

  3.   


    if (!m_wndODraw.Create(NULL, NULL, WS_CHILD|WS_VISIBLE, CRect(200, 200, 400, 400), this, 1234))
    {
    MessageBox("Create ODWindow Failed !");
    return ;
    }
      

  4.   

    在视图中添家一个自定义窗口类成员
    CMyWnd m_wndMy;在工具条响应函数中:
    void CMyView::OnCreateWnd() 
    {
       if(m_wndMy.GetSafeHwnd()) return;   if (!m_wndMy.Create(NULL, NULL, WS_CHILD|WS_VISIBLE, CRect(20, 200 40, 40), this, 1234))
       {
    MessageBox("创建失败!");
        }
    }
      

  5.   

    to solike
    CMyWnd m_wndMy; 什么意思
    CMyWnd 在哪定义的?
      

  6.   

    请问View的实例在哪儿生成?
    m_wndODraw
    E:\VCProj\TraceX1\TestTrace1\MainFrm.cpp(111) : error C2248: 'CMsgShowView::CMsgShowView' : cannot access protected member declared in class 'CMsgShowView'
            e:\vcproj\tracex1\testtrace1\msgshowview.h(16) : see declaration of 'CMsgShowView::CMsgShowView'
      

  7.   

    CView的派生类不能直接生成,它是通过CRuntimeClass类动态创建的,所以会出现你所看到的提示
      

  8.   

    如果你一定要自己创建一个视图的话可以用如下方法:CRuntimeClass* pClass = RUNTIME_CLASS(CMsgShowView);
    ASSERT(pClass);
    CMsgShowView* pView = (CMsgShowView*)pClass->CreateObject(); //创建一个视图
      

  9.   

    to solike:
    我想实现的功能就是使用菜单,可以动态产生一个listview. 这是个普通形式的窗口,有一些消息从中产生.
    [email protected]
    谢谢.
      

  10.   

    to solike
    请问你发了没有?
      

  11.   

    呵呵,我的自定义窗口不是View,要不你发过来吧,方便吗?
    [email protected], 我的Msn [email protected]
      

  12.   

    可以.我是做一个练习程序.我想在OnShowAll 中进行我的处理.我已经发了,
    我的QQ是9723338但是只有晚上能联系.void CMainFrame::OnShowAll() 
    {
    CDocument* pDoc=GetActiveDocument();
    CView* pCurrView=GetActiveView();

    CRuntimeClass* pClass = RUNTIME_CLASS(CMsgShowView);
    ASSERT(pClass);
    CView* pNewView = (CView*)pClass->CreateObject();  pNewView->Create(NULL,
         NULL,
     AFX_WS_DEFAULT_VIEW,
     CRect(200,200,400,400),
     this,
     AFX_IDW_PANE_FIRST,
     NULL); pNewView->OnInitialUpdate(); pNewView->ShowWindow(SW_SHOW);
    }
      

  13.   

    SoLike老兄,我用你的方法怎么不行呀。
    创建倒是创建了,但是显示不出来呀。怎么回事??
      

  14.   

    看你的程序,你的意思是要做单文档对应多视图吧。
    如果是的话应该加在CChildFrame中,而不是CMainFrame中
    如果要做多文档,那么要添加文档模板
      

  15.   

    我主要的意思就是创建一个新的和原来的多文档视图没什么关系的一个SDI(或者普通窗口)都行。只需要保留住HDC或者HWnd就好了。
      

  16.   

    在映射到CChildFrame中的代码如下:void CChildFrame::OnShowAll() 
    {
    CView* pOldView = GetActiveView();
    ASSERT(pOldView); CRuntimeClass* pClass = RUNTIME_CLASS(CMsgShowView);
    ASSERT(pClass);
    CView* pNewView = (CView*)pClass->CreateObject(); 
    ASSERT(pNewView);
    if (pNewView->Create(NULL,
    NULL,
    AFX_WS_DEFAULT_VIEW,
    CRect(200,200,400,400),
    this,
    AFX_IDW_PANE_FIRST,
    NULL))
    {

    pNewView->OnInitialUpdate();

    SetActiveView(pNewView);
    pOldView->ShowWindow(SW_HIDE);
    pNewView->ShowWindow(SW_SHOW);
    RecalcLayout(TRUE);
    }
    }为了更好的看到效果你不妨过载一下CMsgShowView的EraseBkgnd消息,比如:
    BOOL CMsgShowView::OnEraseBkgnd(CDC* pDC) 
    {
             CRect rc;
    pDC->GetClipBox(&rc);
    pDC->FillSolidRect(rc, RGB(255,0,0));
    return TRUE;
    }
      

  17.   

    呵呵,那你就不要从CView派生,而要从CWnd派生
      

  18.   

    我最后解决了这个问题,直接用文档类,代码在公司,下周给大家看。还是用原来的VIEW也无所谓,其实最主要的是能通过自己的菜单生成VIEW,与序列化无关。
      

  19.   

    下边这段代码是代表的是创建一个和原窗口并不父子关系的全新窗口。HWND hwnd=CreateWindowEx(WS_EX_LEFT,lpszHelloClass,"Window Caption",
    WS_VISIBLE,0,0,1024,768,NULL,NULL,AfxGetApp()->  hInstance,NULL);其中的参数lpszHelloClass使用如下方法得到 LPCTSTR lpszHelloClass =
      AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
    LoadCursor(NULL, IDC_ARROW),
    (HBRUSH) (COLOR_WINDOW+1),
    LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_OFFICETYPE)));MSDN中有比较详细的其中参数的讲解。
    创建好以后
    使用ShowWindow(hwnd,SW_SHOW)显示窗口即可