如何利用 CM 实现多cad视图切换快捷键

VCPP VC++ 实现多窗口多视图例子,多个 集合在一个 上,通过左边的标签进行切换 Dialog_Window 对话框与
262万源代码下载-
&文件名称: VCPP& & [
& & & & &&]
&&所属分类:
&&开发工具: Visual C++
&&文件大小: 36 KB
&&上传时间:
&&下载次数: 79
&&提 供 者:
&详细说明:VC++ 实现多窗口多视图例子,多个窗口集合在一个视图上,通过左边的标签进行切换窗口显示。-The VC++ multi-window multi-view example, a collection of multiple windows in a single view, on the left tab switching window displays.
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
(没有文件,原文件不完全或已损坏或有密码)
&[]:很好,推荐下载&[]:很好,推荐下载
&近期下载过的用户:
&&&&&&&&&&&&&&[]
&相关搜索:
&输入关键字,在本站262万海量源码库中尽情搜索:
&[] - MFC的拆分窗口小程序,演示了如何将单文档拆分为两个窗口
&[] - mfc多窗口框架,对于mfc的初学者有帮助。
&[] - 在多文档窗口实现标签切换视图功能,类似傲游浏览器
&[] - 这个是国外网站上找到的一个MFC多文档编程的例子,他实现了视图的标签化控制,很值得学习!
&[] - 用VC++6.0实现的标签页,可以在界面中通过标签切换视图
&[] - 本程序是基于VC的opengl编程,重点开发了对三维物体局部放大,并且通过多视图显示的功能,有一定的参考价值。
&[] - MFC单文档程序中,分割窗口,在每个窗口中添加相应的视图
&[] - opengl在mfc中的单文档多视图显示,适合初学者。可以实现旋转,平移和从不同坐标系观察。
&[] - MFC 窗口多块显示,设置三个视口用于显示,编程语言:openGL, MFC 
&[] - 在VC环境下实现窗体的多视图静态分割,通过移动鼠标可以动态的调整各个窗口的大小,附有详细的注释说明及实现方法,拷贝过去简单修改就能很容易的实现你的应用。单纯视图之间的切换
单文档多视图切换是我在学习MFC中遇到的一个老大难问题,在今天总算是一一破解了。我觉得视图切换分为三个等级,第一是在未切分窗格的情况下切换视图类;第二是在分割窗格的一个窗格内实行视图切换;第三是在分割窗格和未分割之间的切换和视图切换。
在MFC创建SDI的伊始,MFC默认的视图类是CView,如果CView满足你的需求,可以直接单击finish,如果你不想让CView成为你的默认视图类,你可以在下图这个地方修改。
如果你忘记了修改默认的视图类这也没关系,我们可以在代码中改变:
在App类里面有个函数叫InitInstance(),在这里面有一段代码
CSingleDocTemplate* pDocT
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(Cprogram8Doc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CView1)); //这里更改你的默认视图类,注意不要忘记包含头文件哦
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
说完了默认视图类的更改,我们现在进入主题。
1、首先创建你需要切换的视图类,AddClass进入或者创建一个控件然后AddClass创建控件关联类,后者适用于Form之类的控件。
2、控制之处,比如菜单项单击、单击鼠标什么的,我是使用菜单项来切换窗口的
void CMainFrame::OnView1()
// TODO: Add your command handler code here
SwitchToForm(IDD_FORMVIEW1);
void CMainFrame::OnView2()
// TODO: Add your command handler code here
SwitchToForm(IDD_FORMVIEW2);
3、SwitchToForm这个函数主要用于视图切换
在这个函数中主要做以下几个动作:
1、获得当前视图类指针和需要转换的视图类指针,如果是第一次使用需要New一个,并且与文档类关联;
2、改变活动视图;
3、显示新视图和隐藏旧视图;
4、设置控件ID;
5、调整框架视图。
void CMainFrame::SwitchToForm(int nForm)
CView *pOldActiveView=GetActiveView(); //1
CView *pNewActiveView=(CView*)GetDlgItem(nForm);
if(NULL==pNewActiveView)
switch(nForm)
case IDD_FORMVIEW1:
pNewActiveView=(CView*)new CView1;
case IDD_FORMVIEW2:
pNewActiveView=(CView*)new CView2;
case IDD_FORMVIEW3:
pNewActiveView=(CView*)new CView3;
case IDD_FORMVIEW4:
pNewActiveView=(CView*)new CView4;
context.m_pCurrentDoc=pOldActiveView-&GetDocument();
pNewActiveView-&Create(NULL,NULL,WS_CHILD | WS_BORDER,CFrameWnd::rectDefault,this,nForm,&context);
pNewActiveView-&UpdateData();
SetActiveView(pNewActiveView); //2
pNewActiveView-&ShowWindow(SW_SHOW); //3
pOldActiveView-&ShowWindow(SW_HIDE);
if(pOldActiveView-&GetRuntimeClass()==RUNTIME_CLASS(CView1)) //4
pOldActiveView-&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()==RUNTIME_CLASS(CView4))
pOldActiveView-&SetDlgCtrlID(IDD_FORMVIEW4);
pNewActiveView-&SetDlgCtrlID(AFX_IDW_PANE_FIRST);
RecalcLayout(); //5
在看网上其他人的帖子的时候发现在RecalcLayout(); 前面还要加一句delete pOldActiveV我自己觉得这样有些浪费资源,视图类创建完成了隐藏起来,用的时候重新显示。这样的方法应该比每次使用都要创建好一些。小弟不才,有讨论的朋友可以联系我。
带有分割窗格的视图切换
切换视图第二层就是带有分割窗格的视图切换
分割窗格的视图切换,我觉得难点是不容易在有限区域进行视图切换。
1、首先分割窗格,这里我不多解释,详情看下面链接;
2、再给每个视图一个唯一的ID号;
m_splitter.CreateStatic(this,1,2);
m_splitter.CreateView(0,0,RUNTIME_CLASS(CTree1),CSize(100,100),pContext);
m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm1),CSize(100,100),pContext);
CWnd *pWnd=m_splitter.GetPane(0,1);
m_pViews[0]=(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),pContext);
pWnd=m_splitter.GetPane(0,1);
m_pViews[1]=(CView*)m_splitter.GetPane(0,1);
pWnd-&SetDlgCtrlID(m_splitter.IdFromRowCol(0,1));
pWnd-&ShowWindow(SW_SHOW);
RedrawWindow();
注:我这里CreateView一个新视图,就覆盖掉前一个视图,最终显示的是最后一个视图,前面的视图只是隐藏起来,等到使用的时候显示出来就好了。返回值要覆盖返回到基类的语句return CFrameWndEx::OnCreateClient(lpcs, pContext);将这句话注解,然后
3、在哪里激活切换功能自己设计,我使用的是菜单;
4、响应主要包括下面几个步骤:
1、首先获得窗格中的当前视图;
2、使用IsKindOf判断这个类是否是将要切换到的类;
3、获得框架长宽和窗格长宽;
CView *pView=(CView*)m_splitter.GetPane(0,1); //1
m_bTest=pView-&IsKindOf(RUNTIME_CLASS(CForm2)); //2
CRect rcFrame,rcC //3
m_splitter.GetClientRect(&rcClient);
GetClientRect(&rcFrame);
上面的全部是准备工作,下面才是真正的切换;
4、删除原有视图
5、创建当前视图
6、调整框架
if(m_bTest)
m_splitter.DeleteView(0,1);
m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm1),CSize(rcClient.Width(),rcFrame.Height()),NULL);
m_splitter.RecalcLayout();
m_splitter.DeleteView(0,1);
m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm2),CSize(rcClient.Width(),rcFrame.Height()),NULL);
m_splitter.RecalcLayout();
仔细一看,貌似这个还要比单纯视图切换还要简单一些,这也没办法,CSplitterWnd提供了这么一个便捷的方法。
带分割视图与未分割视图之间的切换
这个是三部曲中我认为最难的,并不是说程序有多么难,只是想到这个切分方式真的不容易,今天就把这三部曲的最后一曲分享给大家,也为互联网做一点贡献。
首先说一下程序的思想,为分割窗口层专门独立创建一个基于CFrameWnd的类,然后在这里面写分割视图的代码,再与其他未分割的视图类进行切换。
下面我们来看一下实现的过程:
1、创建一个基于CFrameWnd的派生类CSplitterFrame;
2、添加要填充分割窗口的视图类和与分割视图切换的视图类;
3、为这个派生类重载OnCreateClient函数,构造分割视图
m_Splitter.CreateStatic(this,1,2);
m_Splitter.CreateView(0,0,RUNTIME_CLASS(CLeftTree),CSize(300,0),pContext);
m_Splitter.CreateView(0,1,RUNTIME_CLASS(CRightList),CSize(300,0),pContext);
这里我不解释了,想必大家都很熟悉了,这里我要说一点我自己犯过的错误。我本来想在这里GetClientRect获得窗口大小,但失败了,左思右想不明白,后来才发现,这又不是CMainFrame,所以根本不能获得,要是用API函数。
4、在CMainFrame类里面添加框架和视图类指针变量
CSplitterFrame *m_pSplitterF //分割视图框架指针
CView *m_pV //单独视图类,基于CView类
CView *m_pF //单独视图类,基于CFormView类
int m_nCurrentID; //记录当前视图
5、在CMainFrame类里面重载OnCreateClient函数,创建视图及分割框架
GetClientRect(&rcClient);
m_pView=new CViewS
m_pView-&Create(NULL,NULL,AFX_WS_DEFAULT_VIEW &~WS_BORDER,rcClient,this,NULL,pContext);
m_pView-&ShowWindow(SW_SHOW);
m_pView-&SetDlgCtrlID(AFX_IDW_PANE_FIRST);
pContext-&m_pNewViewClass=(CRuntimeClass*)m_pV //设置默认视图类
m_pForm=new CFormS
m_pForm-&Create(NULL,NULL,AFX_WS_DEFAULT_VIEW &~WS_BORDER,rcClient,this,IDD_FORMSHOW,pContext);
m_pForm-&ShowWindow(SW_HIDE);
m_pSplitterFrame=new CSplitterF
m_pSplitterFrame-&Create(NULL,NULL,AFX_WS_DEFAULT_VIEW &~WS_BORDER,rcClient,this,NULL,0,pContext);
m_pSplitterFrame-&ShowWindow(SW_HIDE);
6、创建视图切换函数
bool CMainFrame::Switch(int nID)
if(nID==m_nCurrentID)
switch(nID)
case IDD_FORMSHOW:
m_pForm-&ShowWindow(SW_SHOW);
m_pForm-&SetDlgCtrlID(AFX_IDW_PANE_FIRST);
m_pView-&ShowWindow(SW_HIDE);
m_pView-&SetDlgCtrlID(AFX_IDW_PANE_FIRST+2);
m_pSplitterFrame-&ShowWindow(SW_HIDE);
m_pSplitterFrame-&SetDlgCtrlID(AFX_IDW_PANE_FIRST+1);
m_nCurrentID=IDD_FORMSHOW;
case AFX_IDW_PANE_FIRST+1:
m_pSplitterFrame-&ShowWindow(SW_SHOW);
m_pSplitterFrame-&SetDlgCtrlID(AFX_IDW_PANE_FIRST);
m_pForm-&ShowWindow(SW_HIDE);
m_pForm-&SetDlgCtrlID(IDD_FORMSHOW);
m_pView-&ShowWindow(SW_HIDE);
m_pView-&SetDlgCtrlID(AFX_IDW_PANE_FIRST+2);
m_nCurrentID=AFX_IDW_PANE_FIRST+1;
case AFX_IDW_PANE_FIRST+2:
m_pView-&ShowWindow(SW_SHOW);
m_pView-&SetDlgCtrlID(AFX_IDW_PANE_FIRST);
m_pForm-&ShowWindow(SW_HIDE);
m_pForm-&SetDlgCtrlID(IDD_FORMSHOW);
m_pSplitterFrame-&ShowWindow(SW_HIDE);
m_pSplitterFrame-&SetDlgCtrlID(AFX_IDW_PANE_FIRST+1);
m_nCurrentID=AFX_IDW_PANE_FIRST+2;
RecalcLayout();
7、创建调用方法
void CMainFrame::OnForm()
// TODO: Add your command handler code here
Switch(IDD_FORMSHOW);
void CMainFrame::OnView()
// TODO: Add your command handler code here
Switch(AFX_IDW_PANE_FIRST+2);
void CMainFrame::OnSplitter()
// TODO: Add your command handler code here
Switch(AFX_IDW_PANE_FIRST+1);
最新教程周点击榜
微信扫一扫Iphone开发(八)利用Tabbed Application模板实现多视图切换_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Iphone开发(八)利用Tabbed Application模板实现多视图切换
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩8页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢VC界面制作(32)
在一些情况下,应用程序有许多信息要显示,当一个窗口内显示不下时,VC提供的MDI应用程序可以解决这个问题,但是如果应用程序只是对单个文档,采用多种方式显示,则采用SDI更合适。那么,如何在单文档应用程序中实现多视图呢?缺省情况下,派生类的构造函数是pretected类型的,必须将它改为public类型,因为我们将会动态生成派生视图类并切换活动的视图。也可以一次生成所有的视图,但是这样造成系统资源的极大浪费。1&&首先利用资源编辑器新建4个对话框,在对话框中添加需要的控件,各个对话框的ID分别为IDD_MULTIVIEW_FORM,IDD_MULTIVIEW_FORM2,IDD_MULTIVIEW_FORM3,IDD_MULTIVIEW_FORM42&&为每一个对话框创建一个CFormView类的派生类,分别为:CView1,CView2,CView3,CView43&&在应用程序的初始化文件中用CView1替换原先的视图,这样程序启动后的缺省显示视图是CView1,修改后的部分代码如下:CSingleDocTemplate*&pDocTpDocTemplate&=&new&CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMultiViewDoc),RUNTIME_CLASS(CMainFrame),&&&&&&&//&main&SDI&frame&windowRUNTIME_CLASS(CView1));AddDocTemplate(pDocTemplate);4&&利用资源编辑器,添加几个菜单,并添加相应的消息处理函数:void&CMainFrame::OnViewView1()&{SwitchToForm(IDD_MULTIVIEW_FORM);&&&}void&CMainFrame::OnViewView2()&{SwitchToForm(IDD_MULTIVIEW_FORM2);&&&}void&CMainFrame::OnViewView3()&{SwitchToForm(IDD_MULTIVIEW_FORM3);&&&}void&CMainFrame::OnViewView4()&{SwitchToForm(IDD_MULTIVIEW_FORM4);&&&}在SDI中CFrame的派生类即CMainFrame控制着所有的视图,而且它允许用户通过消息处理进行视图的切换。进行视图切换的原理很简单,只是断开和旧视图的连接并把他删除,创建一个新视图,将文档和它相连,设置几个标志,然后显示新视图,SwitchToForm函数是进行视图切换的代码函数。void&CMainFrame::SwitchToForm(int&nForm){&&//CDocument*&pDoc&=&GetActiveDocument();&&&&CView&*pOldActiveView=GetActiveView();&&&&&&&&&&&&&//保存旧视图&&&&CView&*pNewActiveView=(CView*)GetDlgItem(nForm);&&&//取得新视图&&&&if(pNewActiveView==NULL)&&&&{&&&&&&&&switch(nForm)&&&&&&&&&&&&//这些ID是对话框的标志符,但也可以用其他的标志&&&&&&&&{&&&&&&&&case&IDD_MULTIVIEW_FORM&:&&&&&&&&&&&&pNewActiveView=(CView*)new&CView1;&&&&&&&&&&&&&&&&&&&&case&IDD_MULTIVIEW_FORM2&:&&&&&&&&&&&&pNewActiveView=(CView*)new&CView2;&&&&&&&&&&&&&&&&&&&&case&IDD_MULTIVIEW_FORM3&:&&&&&&&&&&&&pNewActiveView=(CView*)new&CView3;&&&&&&&&&&&&&&&&&&&&case&IDD_MULTIVIEW_FORM4&:&&&&&&&&&&&&pNewActiveView=(CView*)new&CView4;&&&&&&&&&&&&&&&&&&&&}&&&&&&&&CCreateContext&&&&//将文挡和视图相连&&&&&&&&context.m_pCurrentDoc=pOldActiveView-&GetDocument();pNewActiveView-&Create(NULL,&NULL,&WS_BORDER|WS_CHILD&,&&&&&&&&&&&&CFrameWnd::rectDefault,&this,&nForm,&&context);&&&&&&&&pNewActiveView-&OnInitialUpdate();&&&&}&&&&SetActiveView(pNewActiveView);&&&&&&&&//改变活动的视图&&&&pNewActiveView-&ShowWindow(SW_SHOW);&&//显示新的视图&&&&pOldActiveView-&ShowWindow(SW_HIDE);&&//隐藏旧的视图&&&&if(pOldActiveView-&GetRuntimeClass()&==RUNTIME_CLASS(CView1))pOldActiveView-&SetDlgCtrlID(IDD_MULTIVIEW_FORM);else&if(pOldActiveView-&GetRuntimeClass()&==RUNTIME_CLASS(CView2))pOldActiveView-&SetDlgCtrlID(IDD_MULTIVIEW_FORM2);else&if(pOldActiveView-&GetRuntimeClass()&==RUNTIME_CLASS(CView3))pOldActiveView-&SetDlgCtrlID(IDD_MULTIVIEW_FORM3);else&if(pOldActiveView-&GetRuntimeClass()&==RUNTIME_CLASS(CView4))pOldActiveView-&SetDlgCtrlID(IDD_MULTIVIEW_FORM4);&&&&pNewActiveView-&SetDlgCtrlID(AFX_IDW_PANE_FIRST);&&&&&&&&delete&pOldActiveV&&&//删除旧视图RecalcLayout();&&&&&&&&&&//调整框架窗口}
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:188840次
积分:2500
积分:2500
排名:第12391名
原创:31篇
转载:148篇
评论:46条
(10)(4)(2)(2)(3)(5)(2)(7)(1)(5)(3)(2)(1)(1)(4)(7)(1)(2)(1)(1)(1)(4)(17)(1)(3)(35)(8)(52)

我要回帖

更多关于 3dmax怎么切换视图 的文章

 

随机推荐