现在我用的是单文档,可是现在就是有一个视图,我很象用vb一样,多生成几个的窗体出来,用普通的对话筐行吗?
还有一个是见多几个视图,可是我耗了很久了,还是不行

解决方案 »

  1.   

    //////////////////////////////////////////////////////////////////////////
    //多个视图的切换。                                                  
    //依如下步骤增加一个视图:
    //a.)修改#define NUMVIEWS 的值
    //b.)在CreateAllTheView()里相应位置增加:                
    //    m_pViews[n] = (CView*) new MyViewClass;和
    //   ((MyViewClass*)m_pViews[n])->OnInitialUpdate();行
    //c.)在GetIndex(int nFormID)里增加相应的case
    //////////////////////////////////////////////////////////////////////////
    CView *  CDrivingLicenceApplicationApp::SwitchToView(int nViewID)
    {
    int nIndex = GetIndex(nViewID); ASSERT(nIndex>=0&&nIndex<NUMVIEWS);
    CView* pNewView = m_pViews[nIndex];
    CView* pActiveView =((CFrameWnd*) m_pMainWnd)->GetActiveView();
    if ( !pActiveView ) // 当前没有激活的视图
    return NULL;
    if ( pNewView == pActiveView ) // 当前视图和需要切换的视图相同
    return pActiveView; // 交换视图的窗口ID,使RecalcLayout()可以工作
    UINT temp = ::GetWindowLong(pActiveView->m_hWnd, GWL_ID);
    ::SetWindowLong(pActiveView->m_hWnd, GWL_ID, ::GetWindowLong(pNewView->m_hWnd, GWL_ID));
    ::SetWindowLong(pNewView->m_hWnd, GWL_ID, temp);
    // 显示新的视图,隐藏前一个视图
    pActiveView->ShowWindow(SW_HIDE);
    pNewView->ShowWindow(SW_SHOW);
    ((CFrameWnd*) m_pMainWnd)->SetActiveView(pNewView);
    ((CFrameWnd*) m_pMainWnd)->RecalcLayout();
    pNewView->Invalidate();
    return pActiveView;
    }// 根据Form的ID获得m_pViews[]中的下标
    int CDrivingLicenceApplicationApp::GetIndex(int nFormID)
    {
    switch( nFormID) 
    {
    case IDD_DRIVINGLICENCEAPPLICATION_FORM:
    return 0;
    case IDD_FORMVIEW_ENROL:
    return 1;
    case IDD_FORMVIEW_CHECKUP:
    return 2;
    case IDD_FORMVIEW_VERIFY:
    return 3;
    case IDD_FORMVIEW_MESSAGE:
    return 4;
    case IDD_FORMVIEW_REFER:
    return 5;
    default:
    return -1;
    }
    // return 0;
    }// 创建所有视
    void CDrivingLicenceApplicationApp::CreateAllTheView(void)
    {
    m_pViews[0] = (CView*) new CDrivingLicenceApplicationView;
    m_pViews[1] = (CView*) new EnrolFormView;
    m_pViews[2] = (CView*) new CheckupFormView;
    m_pViews[3] = (CView*) new VerifyFormView;
    m_pViews[4] = (CView*) new MessageFormView;
    m_pViews[5] = (CView*) new ReferFormView; CDocument* pCurrentDoc = ((CFrameWnd*) m_pMainWnd)->GetActiveDocument();
    // 初始化创建上下文相关指针
    CCreateContext newContext;
    newContext.m_pNewViewClass = NULL;
    newContext.m_pNewDocTemplate = NULL;
    newContext.m_pLastView = NULL;
    newContext.m_pCurrentFrame = NULL;
    newContext.m_pCurrentDoc = pCurrentDoc;
    // 最初激活视的ID为AFX_IDW_PANE_FIRST,对新创建的视图增加这个值,注意对CSplitterWnd不能这样使用
    // UINT viewID[NUMVIEWS];
    // viewID[1] = AFX_IDW_PANE_FIRST + 1;
    CRect rect(0, 0, 0, 0);
    for(int nView=1; nView<NUMVIEWS; nView++)
    {
    // 创建新的视图,创建的视图在应用中永久存在,直到应用程序退出,应用程序会自动删除新创建的视图
    m_pViews[nView]->Create(NULL, NULL, 
    (AFX_WS_DEFAULT_VIEW & ~WS_VISIBLE),
    // AFX_WS_DEFAULT_VIEW代表(WS_BORDER | WS_VISIBLE | WS_CHILD)
    // rect, m_pMainWnd, viewID[nView], &newContext);
    rect, m_pMainWnd, AFX_IDW_PANE_FIRST + nView, &newContext);
    } // 当文档模板创建视图的时候,会自动发送WM_INITIALUPDATE消息,因此对于我们自己创建的视图,需要人工发送这条消息
    ((EnrolFormView*)m_pViews[1])->OnInitialUpdate();
    ((CheckupFormView*)m_pViews[2])->OnInitialUpdate();
    ((VerifyFormView*)m_pViews[3])->OnInitialUpdate();
    ((MessageFormView*)m_pViews[4])->OnInitialUpdate();
    ((ReferFormView*)m_pViews[5])->OnInitialUpdate();
    }
      

  2.   

    另外各个视的构造改protected:为public:// MessageFormView 窗体视图class MessageFormView : public CFormView
    {
    DECLARE_DYNCREATE(MessageFormView)public://protected:
    MessageFormView();           // 动态创建所使用的受保护的构造函数
    virtual ~MessageFormView();
      

  3.   

    还有一句 
    #define NUMVIEWS 6
      

  4.   

    你好了之后顺便帮我想下这个问题啊
    http://community.csdn.net/Expert/topic/3192/3192965.xml?temp=.7633631
      

  5.   

    哈哈,我跟你说啊,我很久以前我就问过这个问题了,我也研究了很久,你看这里一下象不象
    再说当时我还没做到这个部分
    http://tech.163.com/2004w03/12500/2004w03_1080024749448.html
      

  6.   

    你好了之后顺便帮我想下这里的这个问题啊
    http://community.csdn.net/Expert/topic/3192/3192965.xml?temp=.7633631
      

  7.   

    http://www.vckbase.com/code/downcode.asp?id=2281
      

  8.   

    try 
    {
        pConn->begintrans();      ModifyTable1();
          ModifyTable2();
       pConn->CommitTrans();
    }