胡荣华象棋名局讲解4:在VC中怎么进行基于RecordView的几个视图的切换?

来源:百度文库 编辑:中科新闻网 时间:2024/04/30 22:00:58
我在运行程序时,运行到
pNewActiveView->Create(NULL, NULL, 0L, CFrameWnd::rectDefault, this, nForm, &context);
pNewActiveView->OnInitialUpdate();
总是遇到access violation错误
下面是视图切换函数:
哪位大虾帮我看看吧,谢谢。

void CMainFrame::SwitchToForm(int nForm)
{
// 获取原来的活动窗体的视图句柄
CView* pOldActiveView = GetActiveView();

// 获取由"nForm"标识的窗体所对应的视图句柄
CView* pNewActiveView = (CView*) GetDlgItem(nForm);

// 若视图句柄为空,则创建一新的。
if (pNewActiveView == NULL)
{
if (nForm == IDD_DB_FORM)
pNewActiveView = (CView*)new CDBView;
if (nForm == IDD_BOOKINFO_FORM)
pNewActiveView = (CView*)new CBookInfoView;
if (nForm == IDD_PROVIDER_FORM)
pNewActiveView = (CView*)new CProviderView;

// 创建新视图
CCreateContext context;
context.m_pCurrentDoc = pOldActiveView->GetDocument();
pNewActiveView->Create(NULL, NULL, 0L, CFrameWnd::rectDefault, this, nForm, &context);
pNewActiveView->OnInitialUpdate();
}

// 选择pNewActiveView为活动窗体
SetActiveView(pNewActiveView);

// 显示活动窗体,隐藏非活动窗体
pNewActiveView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);

// 设置ID
int ID;
if (pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CDBView))
ID = IDD_DB_FORM;
if (pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CBookInfoView))
ID = IDD_BOOKINFO_FORM;
if (pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CProviderView))
ID = IDD_PROVIDER_FORM;

//设置窗体的ID号
pOldActiveView->SetDlgCtrlID(ID);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
RecalcLayout();//调整框架窗口

}