admin 管理员组

文章数量: 887021


2023年12月22日发(作者:玫瑰花代码python教程)

相信这就是vc的弊病吧!项目作了很久发现应该用多视图,可是刚开始建立工程的时候考虑不周阿,没办法,只能从网上搜了,竟搜到了一个不错的函数可以解决这个问题:

void CMainFrame::SwitchToView(int nForm)

{

};

//CDocument* pDoc = GetActiveDocument();

CView *pOldActiveView=GetActiveView(); //保存旧视图

CView *pNewActiveView=(CView*)GetDlgItem(nForm); //取得新视图

if(pNewActiveView==NULL)

{

}

SetActiveView(pNewActiveView); //改变活动的视图

pNewActiveView->ShowWindow(SW_SHOWMAXIMIZED); //显示新的视图

pOldActiveView->ShowWindow(SW_HIDE); //隐藏旧的视图

pNewActiveView->GetDocument()-SetTitle("。。。。");

if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CHSubView))

pOldActiveView->SetDlgCtrlID(IDD_HSUB_VIEW);

if(pOldActiveView-GetRuntimeClass() ==RUNTIME_CLASS(CPlantView))

pOldActiveView-SetDlgCtrlID(IDD_PLANT_VIEW);

else

switch(nForm) //这些ID是对话框的标志符,但也可以用其他的标志

{

case IDD_PLANT_VIEW :

}

CCreateContext context; //将文挡和视图相连

context.m_pCurrentDoc=pOldActiveView->GetDocument();

pNewActiveView->Create(NULL, NULL, WS_BORDER|WS_CHILD , CFrameWnd::rectDefault,

pNewActiveView->OnInitialUpdate();

pNewActiveView=(CView*)new CPlantView;

break;

pNewActiveView=(CView*)new CHSubView;

break;

case IDD_HSUB_VIEW :

this, nForm, &context);

pNewActiveView-SetDlgCtrlID(AFX_IDW_PANE_FIRST);

delete pOldActiveView; //删除旧视图

RecalcLayout(); //调整框架窗口

这个函数很好用大家可以参考一下。其中IDD_HSUB_VIEW 等都是新建立的FormView,也就是继承了CFormView类的新类。注意将各个新类中的构造函数改成public,才能用此函数不出错。

由于最近做的一个程序用到了单文档多视图切换,所以把它总结一下。内容如下:

单文档多视图的切换有两种情况,即分栏多视图切换和无分栏多视图切换,以下是两个对应情况的可重用函数:

分栏多视图切换:

Code:

1. BOOL CMainFrame::ReplaceView(int row, int col, CRuntimeClass *pViewClass, SIZE size)

2. {

3. CCreateContext context;

4. BOOL bSetActive;

5.

6. if ((this->m_e(row,col)->IsKindOf(pViewClass))==TRUE)

7. return FALSE;

8.

9. //获取文档对象的指针,以便在创建新视图的过程中能够使用它

10. CDocument * pDoc= ((CView *)m_e(row,col))->GetDocument();

11.

12. CView * pActiveView=this->GetActiveView();

13. if (pActiveView==NULL || pActiveView==m_e(row,col))

14. bSetActive=TRUE;

15. else

16. bSetActive=FALSE;

17.

18. pDoc->m_bAutoDelete=FALSE; //设置标志,这样当视图销毁时不会删除文档

19. ((CView *) m_e(row,col))->DestroyWindow(); //删除存在的视图

20. pDoc->m_bAutoDelete=TRUE; //设回默认的标志

21.

22. //创建新视图

23. context.m_pNewViewClass=pViewClass;

24. context.m_pCurrentDoc=pDoc;

25. context.m_pNewDocTemplate=NULL;

26. context.m_pLastView=NULL;

27. context.m_pCurrentFrame=NULL;

28. m_View(row,col,pViewClass,size, &context);

29.

30. CView * pNewView= (CView *)m_e(row,col);

31.

32. if (bSetActive==TRUE)

33. this->SetActiveView(pNewView);

34.

35. m_Layout(); //重新计算位置

36. pNewView->OnInitialUpdate(); //调用初始化函数

37. return TRUE;

38. }

无分栏多视图切换

Code:

1. BOOL CMainFrame::ReplaceView(CRuntimeClass *pViewClass)

2. {

3. CCreateContext context;

4.

5. CDocument *pDoc = GetActiveView()->GetDocument();

6.

7. //销毁先前的视图窗口

8. pDoc->m_bAutoDelete = FALSE;

9. GetActiveView()->DestroyWindow();

10. pDoc->m_bAutoDelete = TRUE;

11.

12. //创建新视图

13. context.m_pNewViewClass = pViewClass;

14. context.m_pCurrentDoc = pDoc;

15. context.m_pNewDocTemplate = NULL;

16. context.m_pLastView = NULL;

17. context.m_pCurrentFrame = NULL;

18. CView *pNewView = (CView *)this->CreateView(&context);

19.

20. //设置新视图为活动状态

21. this->SetActiveView(pNewView);

22. RecalcLayout();

23.

24. //初始化新视图

25. pNewView->OnInitialUpdate();

26.

27. return TRUE;

28.

29. }

两种情况的原理一样,差别只在创建新视图后视图指针的获取。一般情况下,这两个函数当中的一个放在CMainFrame里,然后在相应的响应函数里获得主窗口的指针来调用。例如单文档无分栏情况下已经继承实现了一个视图类CDeviceTabView,切换视图的方法为:

Code:

1. //获得主窗口指针

2. CMainFrame *pFram = (CMainFrame *)AfxGetMainWnd();

3. //切换视图

4. pFram->ReplaceView(RUNTIME_CLASS(CDeviceTabView));

OK,这样就好了,希望以上内容与你有所帮助,Good luck!


本文标签: 视图 切换 文档 函数 分栏