文档,视结构(MVC结构)只是一种设计方法,与你的ocx无关。
如果是使用MFC的文档/视图,应该需要MFC库的支持

解决方案 »

  1.   

    可以,以改造一个SDI 为例子,说明如何在OCX中使用 MVC 结构。
    1 使用ClassWizard创建一个 SDI 的MFC工程
    2 使用ClassWizard再创建一个 MFC ActiveX 工程
    3 将 SDI工程中 frame, doc, view 相关.h .cpp文件复制到 ocx 工程中
    4 在 ocx  的  OnCreate 中加入: ( 其中的XXXX用你的工程中的类名称替换)         CXXXXDoc*  pDoc;
             CXXXXFrame* pFrame;
             
      pDoc=new CXXXXDoc;
    pDoc->OnNewDocument( );
    CCreateContext* pContext;
    RECT rect;

    GetClientRect(&rect);
    pContext=new CCreateContext;
    memset(pContext,0,sizeof(pContext));
    pContext->m_pNewViewClass=RUNTIME_CLASS(CXXXXView);
    pContext->m_pCurrentDoc=pDoc;
    pFrame=new CXXXXFrame;
    BOOL bSucess=pFrame->Create(NULL, "ZGrid",WS_CHILD|WS_VISIBLE   ,
    rect,this, NULL,0,pContext);
    /*************************************************
     * 设置应用的主窗口目的是:
     * 在 MFC 的 ViewPrev.cpp 的第82,83行
     *  (在函数CView::DoPrintPreview中)有这样的脚本
     *
     *   CFrameWnd* pParent = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
     *   ASSERT_VALID(pParent);
     *   
     *  所以必须要有下面的一行 AfxGetApp()->m_pMainWnd= pFrame;
     *  否则   PrintPreview()将引发错误
     **********************************************************/
    AfxGetApp()->m_pMainWnd= pFrame;
    //激活视图
    POSITION pos=pDoc->GetFirstViewPosition();
    if(pos!=NULL)
    pView=(CGridView*)pDoc->GetNextView(pos);
    pFrame->SetActiveView(pView);
    pView->OnInitialUpdate();
    delete pContext;
    OK 
    总结: 在MFC程序中通常是由一个 Frame 窗口管理 Doc 和View ,View是嵌在 Frame中的子窗口。所以要在OCX中使用 文档视结构,必须为文档和视找一个安生的窝(Frame) 。最简单的方法就是在 OCX的客户区创建一个Frame ,Frame::Create的最后一个参数是CCreateContext 结构,在该结构中定义了与Frame关联的文档对象和 视的类型 RUNTIME_CLASS(CXXXXView);在 《深入浅出MFC》中的文档视部分的 框架窗口的创建过程中有比较详细的讲述。