mfc视图切换全总结

上传人:第*** 文档编号:37198055 上传时间:2018-04-08 格式:DOC 页数:8 大小:36KB
返回 下载 相关 举报
mfc视图切换全总结_第1页
第1页 / 共8页
mfc视图切换全总结_第2页
第2页 / 共8页
mfc视图切换全总结_第3页
第3页 / 共8页
mfc视图切换全总结_第4页
第4页 / 共8页
mfc视图切换全总结_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《mfc视图切换全总结》由会员分享,可在线阅读,更多相关《mfc视图切换全总结(8页珍藏版)》请在金锄头文库上搜索。

1、MFCMFC 视图切换全总结视图切换全总结交流的朋友请加我 QQ:451072182我的百度空间:http:/ MFC 中遇到的一个老大难问题,在今天总算是一一破解了。我觉得视图切换分为三个等级,第一是在未切分窗格的情况下切换视图类;第二是在分割窗格的一个窗格内实行视图切换;第三是在分割窗格和未分割之间的切换和视图切换。在 MFC 创建 SDI 的伊始,MFC 默认的视图类是 CView,如果 CView满足你的需求,可以直接单击 finish,如果你不想让 CView 成为你的默认视图类,你可以在下图这个地方修改。如果你忘记了修改默认的视图类这也没关系,我们可以在代码中改变:在 App 类里

2、面有个函数叫 InitInstance(),在这里面有一段代码CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(Cprogram8Doc),RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CView1); /这里更改你的默认视图类,注意不要忘记包含头文件哦if (!pDocTemplate)return FALSE;AddDocTemplate(pDocTemplate);说完了默认视图类的更改,我们现在进入主题。

3、1、首先创建你需要切换的视图类,AddClass 进入或者创建一个控件然后 AddClass 创建控件关联类,后者适用于 Form 之类的控件。2、控制之处,比如菜单项单击、单击鼠标什么的,我是使用菜单项来切换窗口的void CMainFrame:OnView1() / TODO: Add your command handler code hereSwitchToForm(IDD_FORMVIEW1); void CMainFrame:OnView2() / TODO: Add your command handler code hereSwitchToForm(IDD_FORMVIEW2)

4、; 3、SwitchToForm 这个函数主要用于视图切换在这个函数中主要做以下几个动作:1、获得当前视图类指针和需要转换的视图类指针,如果是第一次使用需要 New 一个,并且与文档类关联;2、改变活动视图;3、显示新视图和隐藏旧视图;4、设置控件 ID;5、调整框架视图。void CMainFrame:SwitchToForm(int nForm) CView *pOldActiveView=GetActiveView(); /1CView *pNewActiveView=(CView*)GetDlgItem(nForm);if(NULL=pNewActiveView)switch(nFor

5、m)case IDD_FORMVIEW1:pNewActiveView=(CView*)new CView1;break;case IDD_FORMVIEW2:pNewActiveView=(CView*)new CView2;break;case IDD_FORMVIEW3:pNewActiveView=(CView*)new CView3;break;case IDD_FORMVIEW4:pNewActiveView=(CView*)new CView4;break;default:break;CCreateContext context;context.m_pCurrentDoc=pOl

6、dActiveView-GetDocument();pNewActiveView-Create(NULL,NULL,WS_CHILD | WS_BORDER,CFrameWnd:rectDefault,this,nForm,pNewActiveView-UpdateData();SetActiveView(pNewActiveView); /2pNewActiveView-ShowWindow(SW_SHOW); /3pOldActiveView-ShowWindow(SW_HIDE);if(pOldActiveView-GetRuntimeClass()=RUNTIME_CLASS(CVie

7、w1) /4pOldActiveView-SetDlgCtrlID(IDD_FORMVIEW1);else if(pOldActiveView- GetRuntimeClass()=RUNTIME_CLASS(CView2)pOldActiveView-SetDlgCtrlID(IDD_FORMVIEW2);else if(pOldActiveView- GetRuntimeClass()=RUNTIME_CLASS(CView3)pOldActiveView-SetDlgCtrlID(IDD_FORMVIEW3);else if(pOldActiveView- GetRuntimeClass

8、()=RUNTIME_CLASS(CView4)pOldActiveView-SetDlgCtrlID(IDD_FORMVIEW4);pNewActiveView-SetDlgCtrlID(AFX_IDW_PANE_FIRST);RecalcLayout(); /5 在看网上其他人的帖子的时候发现在 RecalcLayout(); 前面还要加一句delete pOldActiveView;我自己觉得这样有些浪费资源,视图类创建完成了隐藏起来,用的时候重新显示。这样的方法应该比每次使用都要创建好一些。小弟不才,有讨论的朋友可以联系我。带有分割窗格的视图切换带有分割窗格的视图切换切换视图第二层就是

9、带有分割窗格的视图切换分割窗格的视图切换,我觉得难点是不容易在有限区域进行视图切换。1、首先分割窗格,这里我不多解释,详情看下面链接;2、再给每个视图一个唯一的 ID 号;m_splitter.CreateStatic(this,1,2);m_splitter.CreateView(0,0,RUNTIME_CLASS(CTree1),CSize(100,100),pC ontext);m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm1),CSize(100,100),p Context);CWnd *pWnd=m_splitter.GetPane(0,

10、1);m_pViews0=(CView*)m_splitter.GetPane(0,1);pWnd-SetDlgCtrlID(IDD_FORM1);pWnd-ShowWindow(SW_HIDE);m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm2),CSize(100,100),p Context);pWnd=m_splitter.GetPane(0,1);m_pViews1=(CView*)m_splitter.GetPane(0,1);pWnd-SetDlgCtrlID(m_splitter.IdFromRowCol(0,1);pWnd-Show

11、Window(SW_SHOW);RedrawWindow();return true;注:我这里 CreateView 一个新视图,就覆盖掉前一个视图,最终显示的是最后一个视图,前面的视图只是隐藏起来,等到使用的时候显示出来就好了。返回值要覆盖返回到基类的语句 return CFrameWndEx:OnCreateClient(lpcs, pContext);将这句话注解,然后return true;3、在哪里激活切换功能自己设计,我使用的是菜单;4、响应主要包括下面几个步骤:1、首先获得窗格中的当前视图;2、使用 IsKindOf 判断这个类是否是将要切换到的类;3、获得框架长宽和窗格长宽;

12、CView *pView=(CView*)m_splitter.GetPane(0,1); /1m_bTest=pView-IsKindOf(RUNTIME_CLASS(CForm2); /2CRect rcFrame,rcClient; /3m_splitter.GetClientRect(GetClientRect(上面的全部是准备工作,下面才是真正的切换;4、删除原有视图5、创建当前视图6、调整框架if(m_bTest)m_splitter.DeleteView(0,1);m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm1),CSize(rcCl

13、ient.Wi dth(),rcFrame.Height(),NULL);m_splitter.RecalcLayout();elsem_splitter.DeleteView(0,1);m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm2),CSize(rcClient.Wi dth(),rcFrame.Height(),NULL);m_splitter.RecalcLayout();仔细一看,貌似这个还要比单纯视图切换还要简单一些,这也没办法,CSplitterWnd 提供了这么一个便捷的方法。带分割视图与未分割视图之间的切换带分割视图与未分割视图之

14、间的切换这个是三部曲中我认为最难的,并不是说程序有多么难,只是想到这个切分方式真的不容易,今天就把这三部曲的最后一曲分享给大家,也为互联网做一点贡献。首先说一下程序的思想,为分割窗口层专门独立创建一个基于CFrameWnd 的类,然后在这里面写分割视图的代码,再与其他未分割的视图类进行切换。下面我们来看一下实现的过程:1、创建一个基于 CFrameWnd 的派生类 CSplitterFrame;2、添加要填充分割窗口的视图类和与分割视图切换的视图类;3、为这个派生类重载 OnCreateClient 函数,构造分割视图m_Splitter.CreateStatic(this,1,2);m_Sp

15、litter.CreateView(0,0,RUNTIME_CLASS(CLeftTree),CSize(300,0),p Context);m_Splitter.CreateView(0,1,RUNTIME_CLASS(CRightList),CSize(300,0),p Context);return true;这里我不解释了,想必大家都很熟悉了,这里我要说一点我自己犯过的错误。我本来想在这里 GetClientRect 获得窗口大小,但失败了,左思右想不明白,后来才发现,这又不是 CMainFrame,所以根本不能获得,要是用 API 函数。4、在 CMainFrame 类里面添加框架和

16、视图类指针变量CSplitterFrame *m_pSplitterFrame; /分割视图框架指针CView *m_pView; /单独视图类,基于 CView 类CView *m_pForm; /单独视图类,基于 CFormView 类int m_nCurrentID; /记录当前视图5、在 CMainFrame 类里面重载 OnCreateClient 函数,创建视图及分割框架CRect rcClient;GetClientRect(m_pView=new CViewShow;m_pView-Create(NULL,NULL,AFX_WS_DEFAULT_VIEW m_pView-ShowWindow(SW_SHOW);m_pView-SetDl

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号