VC单文档切分动态更换多视图代码分析
汤米 @ 2004-09-21 14:39
最近iMaker2000的界面设计所用的是Doc/View结构,涉及到Single Document的多视图带切分的切换。呵呵,光是述说都有点拗口了。VC做界面的确是麻烦啊,不过做好了我相信要比VB或者DELPHI要好,灵活度也会更好。不过就工程角度来说,VC做界面学学也就行了,如果要大规模的做,还是简单快捷的工具比较好。
在网上找了很久相关的代码,最后终于在CodeGure上面找到了一个实现了相应功能的Project。一看时间,晕!98年的,算了,能实现功能就行了。
建立View的过程就不多说了,这里主要说说怎么样切换的。
不带切分的切换比较普遍了,VC技术内幕就有一个详细的代码,我待会会把代码也一起贴出来。
带切分的主要的函数有2个,一个是建立时候的函数,一个是切换的函数,两个基本上很类似,这里分析一下切换的函数:
void CMainFrame::OnSwitchView1()
{
// TODO: Add your command handler code here
CRect cr;
GetClientRect(&cr);//取得客户区的显示区域
CSize paneSize1(3*cr.Width()/4, cr.Height());//设定新view大小
CCreateContext Context;//声明视图文档联系结构并设定其内容
Context.m_pNewViewClass=RUNTIME_CLASS(CSwitchView1);
Context.m_pCurrentDoc=((CSwitchApp*)AfxGetApp())->m_pDoc;
Context.m_pCurrentFrame=this;
Context.m_pNewDocTemplate=Context.m_pCurrentDoc->GetDocTemplate();
Context.m_pLastView=(CView*)m_wndSplitter.GetPane(0,0);
m_wndSplitter.DeleteView(0, 1);//删除第1行第2列的View
m_wndSplitter.CreateView(0, 1,RUNTIME_CLASS(CSwitchView1),paneSize1, &Context);//动态创建View1
CSwitchView1 *pView=(CSwitchView1*)m_wndSplitter.GetPane(0,1);//得到切分窗口的指针
pView->GetParentFrame()->RecalcLayout();//重绘主窗口
m_wndSplitter.RecalcLayout();//重绘分隔条窗口
pView->OnInitialUpdate();//估计是一些初始化的操作
m_wndSplitter.SetActivePane(0,1);//激活新的分隔区域
}
不带切分的代码如下:
void CMainFrame::SwitchToView(int nForm)
{
//CDocument* pDoc = GetActiveDocument();
CView *pOldActiveView=GetActiveView(); //保存旧视图
CView *pNewActiveView=(CView*)GetDlgItem(nForm); //取得新视图
if(pNewActiveView==NULL)
{
switch(nForm)
//这些ID是对话框的标志符,但也可以用其他的标志
{
case IDD_DIALOG1 :
pNewActiveView=(CView*)new TForm;
break;
case IDD_FORMVIEW :
pNewActiveView=(CView*)new TForm2;
break;
}
CCreateContext context; //将文挡和视图相连
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(TForm))
pOldActiveView->SetDlgCtrlID(IDD_DIALOG1);
else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(TForm2))
pOldActiveView->SetDlgCtrlID(IDD_FORMVIEW);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
delete pOldActiveView; //删除旧视图
RecalcLayout(); //调整框架窗口
}
比对一下可以看出,带切分的主要是通过m_wndSplitter这样一个成员进行操作,而不带切分的则是直接对整个View进行操作。(因为没有m_wndSplitter啊,呵呵。)
补充一下:刚刚调试了一下代码,有点波折,不过还是顺利通过了,其实代码可以简化很多。
void CMainFrame::OnSwitchView1()
{
m_wndSplitter.DeleteView(1, 0);
m_wndSplitter.CreateView(1, 0,
RUNTIME_CLASS(TForm2),
CSize(0, 0),
NULL);
m_wndSplitter.RecalcLayout();
}
当然,上面这个代码只涉及到了界面的切换,具体的程序中的应用很可能和文档有关,而且需要精确一点的控制,就需要看第一个函数了。注意我的View是纵向的2个,所以参数是1,0。
相关推荐
VC ++多视图切换
VC ++多视图切换
CCreateContext
CCreateContext是MFC框架所使用的一种结构,它将构成文档/视的组件联系起来。这个结构包括指向文档的指针,框架窗口,视以及文档模板,它还包含一个指向CRuntimeClass的指针,以指明所创建的视的类型。其数据成员如下: m_pNewViewClass:指向创建上下文的视的CRuntimeClass的指针。 m_pCurrentDoc:指向文档对象的指针,以和新视联系起来。 m
在视图之间切换的VC界面
自己用VC6.0做的界面,界面中包括视图分割,以及多视之间的切换,有源代码。
VC中实现单文档切换多视图的方法
先在CMainFrame中包含原来系统生成的视图类 #include "****View.h" 注:当你包含系统生成的视图类的头文件时,要把原视图中的GetDocument()函数删去,否则会报错 然后在CMainFrame类中声名一个该类的实例以保存系统原来的视图 protected: C****View m_pOldView; 这时用类向导新建一个类,基类可以指定为
vc++6.0 窗体分割的三种方法
分割窗口将窗口分成几个部分,每个部分通常代表一个视图(但也可以是具有子窗口标识的CWnd对象),又称窗格。如果想在一个窗口里面观察文档的不同部分,或者是在一个窗口里用不同类型的视图(比如用图表和表格)观察同一个文档,那么采用分割窗口是非常方便的。许多优秀的软件都采用了分割窗口技术,因此我们有必要掌握分割窗口的用法。
VS2015 MFC单文档下进行OpenGL编程的框架
上传代码是VS2015平台下,在单文档上进行OpenGL开发的示例。具体文档,请参考 https://blog.youkuaiyun.com/zhangkaihang/article/details/7459634
VC 单文档方式下多视图的实现及自由切换
转载自:http://blog.youkuaiyun.com/teleinfor/archive/2007/10/31/1858976.aspx 结合网上学习总结别人的例子,以及参考MSDN给出的例子,对SDI多视图的实现进行了一个简单的总结,以记录学习点滴。 首先在h文件有如下声明
VC实现的视图分割程序
通过本文提出的分割视图创建框架,可以满足对视图进行复杂控制的需求,希望本文可以给大家一个启发,从而能够创建更为完美的分割视图应用程序
VC单文档切分动态更换
网事如风拒绝浮躁,记录技术人生中的点滴,希望能和偶然来到这里的你共同进步。 2004 十一月> >>日一二三四五六12345678910
VS2015制作MFC设计带文本显示的进度条
声明: 这是我下载其他高手的代码,感谢! 使用方法: 1:添加文件:TextProgressCtrl.h和TextProgressCtrl.cpp至你的工程目录下。 2:在工程中引用头文件:TextProgressCtrl.h 3:替换CProgressCtrl m_prog;为CTextProgressCtrl m_prog; 即用现在进度条的扩展类来替换原来的类 4:其他使用一样。 希望对各位有所帮助,谢谢!
很不错的VC++窗口视图分割示例
可变的分割视图,VC++从多种方式分割窗体视图,上下分割、左右分割,交叉分割等,包括了大家常见的窗口分割方式,其中一种效果如测试截图所示,VC++6.0可直接编译源代码。 运行环境:Windows/Visual C/C++
vc中单文档程序切换不同视图
void CMainFrame::SwitchViews(int nForm) { CView* pOldView = GetActiveView(); CView* pNewView; CCreateContext cc; cc.m_pCurrentDoc = pOldView->GetDocument(); CString title; switch(nForm) { cas
旋转因子量化仿真
在单bit接收机中,通过量化FFT核函数来简化计算,将复数坐标中旋转因子单位圆上的点近似到正方形四个边上,就能够用累加实现复数乘法,从而避免使用DSP乘法器。通过仿真查看不同阶的核函数简化效果。
MFC基于单文档分割窗口
创建一个MFC单文档应用程序命名为test 打开资源管理器Dialog,右击鼠标,插入两个对话框 属性分别改为
将pytorch的权值矩阵量化为定点数补码并导入FPGA中
Xilinx FPGA实现LSTM算法时对ROM的初始化 将pytorch框架的权重矩阵以定点数补码的形式导入到FPGA中 文章目录Xilinx FPGA实现LSTM算法时对ROM的初始化1. pytorch框架中的LSTM2. 初始化一个RNN模型 3. 初始化ROM的coe文件格式 4. 将参数转换为补码,并且输出到coe文件 5. 配置一个ROM 6. 结论7. 代码 1. pytorch框架中的LSTM pytorch框架将LSTM算法中的八个权值矩阵连接成两个矩阵,假设要导入的LSTM网络的输
Catia二次开发QueryInterface的操蛋问题
探索了很久,尝试录制宏,打开部件属性窗口,然后随意设置一些属性(必须改变一些东西才能录制成功,否则不会录制到任何东西),再看录制的结果,发现原来CATIAAnalyze是从Product那里来的。例如获得一个部件的体积,找到相关接口CATIAAnalyze,但是这个部件的CATIAAnalyze的对象不知道如何获取。总结一下,写Catia二开代码,就像漂亮国那款《莫里秀》 又名《爸爸死哪了》的综艺节目,大部分时间都是在找爸爸!Catia二开很痛苦,明明已经找到接口类,但是却不知道怎么获得这个接口类的对象。
使用VC轻松实现视图切换
使用VC创建单文档,并实现视图切换步骤(一):在CMainFrame类中添加CSplitterWnd类对象:CSplitterWnd m_wndSplitter;重载CMainFrame类的OnCreateClient()函数,代码如下:BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {
FICO F.27 Customer statement 打印
需求,定制化打印,替换标准的F.27打印 类似于采购订单的打印,但是略有不同,查阅资料之后步骤如下: T-code F.27 is SAP standard program to produce customer/vendor correspondence (letter). Correspondence Type is used to specify the related printing program and form for the particular correspondence. SAP
可切换视图的单文档静态分割窗口总结
http://hi.baidu.com/daihaipengdhp/blog/item/18b1b713fbd4cdd3f6039e31.html 2007-11-17 21:01经过多方寻找资料和反复试验,终于实现了在单文档程序中分割窗口,并且可以对视图进行随意切换,以下是比较详尽的步骤: 1,向导第四步,选高级,“使用分割栏”挑勾,原始VIEW类为CMyView,
ESP32驱动TFT屏幕实战:LVGL与TFT_eSPI完美结合
本文详细介绍了如何在ESP32上结合TFT_eSPI驱动库与LVGL图形库,实现高效、流畅的嵌入式GUI开发。内容涵盖硬件连接、软件环境搭建、库配置、LVGL移植、界面创建及性能优化等全流程实战指南,帮助开发者快速构建低成本、高性能的交互式显示应用。
FPGA实现DDR接口
verilog// DDR2控制器状态机// 初始化序列// 发出初始化命令endendendend// 自动预充电end// 其他状态...endcaseendend。
在单文档程序中动态切换多个窗体的源码程序
软件说明: 摘要:本文通过一个程序实例描述了在VC++6.0下如何在单文档程序中通过菜单动态控制多 个窗体的切换。 一、 引言 我们在编制程序中根据需求的不同会在程序风格上选择多文档、单文档或是对话框模式 ,对于单文档模式可能是我们使用比较多的,但有时我们想采用单文档的形式显示多个不同 的窗体,如作为数据库前台应用程序就会遇到此类问题,数据库由大量的表单组成,而同常 一个...
回归预测 | MATLAB实现基于贝叶斯线性回归(Bayesian Regression)的多变量输入回归预测
回归预测 | MATLAB实现基于贝叶斯线性回归(Bayesian Regression)的多变量输入回归预测
727



被折叠的 条评论
为什么被折叠?



