VC单文档切分动态更换多视图代码分析

VC++ MFC文档视图程序静态背景图片实现:双缓冲绘图与资源管理实战 在Windows桌面应用开发中,图形用户界面(GUI)的绘制效率和视觉体验是核心考量。双缓冲绘图技术通过先在内存中完成所有绘制操作,再一次性输出到屏幕,有效解决了画面闪烁问题,是提升界面流畅度的关键技术。其工程价值在于能够显著改善用户交互体验,尤其适用于文档编辑器、数据可视化工具等需要频繁重绘的场景。本文聚焦于VC++ MFC框架下的具体实现,通过封装资源管理类,将JPG/PNG等格式图片作为自定义资源嵌入程序,并结合双缓冲机制,在文档视图架构中稳健地实现了静态背景功能。该方案不仅解决了滚动视图中的闪烁问题 阅读详情

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。

MFC 单文档视图中进行多种视图的切换 MFC 单文档视图中进行多种视图的切换 MFC 单文档视图中进行多种视图的切换 立即下载

相关推荐

VC ++多视图切换

VC ++多视图切换

CCreateContext

CCreateContext是MFC框架所使用的一种结构,它将构成文档/视的组件联系起来。这个结构包括指向文档的指针,框架窗口,视以及文档模板,它还包含一个指向CRuntimeClass的指针,以指明所创建的视的类型。其数据成员如下: m_pNewViewClass:指向创建上下文的视的CRuntimeClass的指针。 m_pCurrentDoc:指向文档对象的指针,以和新视联系起来。 m

kl418a的专栏 727

在视图之间切换的VC界面

自己用VC6.0做的界面,界面中包括视图分割,以及多视之间的切换,有源代码。

VC中实现单文档切换多视图的方法

先在CMainFrame中包含原来系统生成的视图类 #include "****View.h" 注:当你包含系统生成的视图类的头文件时,要把原视图中的GetDocument()函数删去,否则会报错 然后在CMainFrame类中声名一个该类的实例以保存系统原来的视图 protected:     C****View m_pOldView; 这时用类向导新建一个类,基类可以指定为

求知者 972

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文件有如下声明

MOKA 880

VC实现的视图分割程序

通过本文提出的分割视图创建框架,可以满足对视图进行复杂控制的需求,希望本文可以给大家一个启发,从而能够创建更为完美的分割视图应用程序

VC单文档切分动态更换

网事如风拒绝浮躁,记录技术人生中的点滴,希望能和偶然来到这里的你共同进步。 2004 十一月> >>日一二三四五六12345678910

xu123的专栏 1870

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

haolly的文章 1091

旋转因子量化仿真

在单bit接收机中,通过量化FFT核函数来简化计算,将复数坐标中旋转因子单位圆上的点近似到正方形四个边上,就能够用累加实现复数乘法,从而避免使用DSP乘法器。通过仿真查看不同阶的核函数简化效果。

CyberInversion的博客 3104

MFC基于单文档分割窗口

创建一个MFC单文档应用程序命名为test 打开资源管理器Dialog,右击鼠标,插入两个对话框 属性分别改为

无涟漪77的博客 1631

将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网络的输

随缘分享 4528

Catia二次开发QueryInterface的操蛋问题

探索了很久,尝试录制宏,打开部件属性窗口,然后随意设置一些属性(必须改变一些东西才能录制成功,否则不会录制到任何东西),再看录制的结果,发现原来CATIAAnalyze是从Product那里来的。例如获得一个部件的体积,找到相关接口CATIAAnalyze,但是这个部件的CATIAAnalyze的对象不知道如何获取。总结一下,写Catia二开代码,就像漂亮国那款《莫里秀》 又名《爸爸死哪了》的综艺节目,大部分时间都是在找爸爸!Catia二开很痛苦,明明已经找到接口类,但是却不知道怎么获得这个接口类的对象。

gergul的专栏 748

使用VC轻松实现视图切换

使用VC创建单文档,并实现视图切换步骤(一):在CMainFrame类中添加CSplitterWnd类对象:CSplitterWnd m_wndSplitter;重载CMainFrame类的OnCreateClient()函数,代码如下:BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {

Lassewang的成长历程 2871

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

IamRunjiang的博客 1969

可切换视图的单文档静态分割窗口总结

 http://hi.baidu.com/daihaipengdhp/blog/item/18b1b713fbd4cdd3f6039e31.html 2007-11-17 21:01经过多方寻找资料和反复试验,终于实现了在单文档程序中分割窗口,并且可以对视图进行随意切换,以下是比较详尽的步骤: 1,向导第四步,选高级,“使用分割栏”挑勾,原始VIEW类为CMyView,

911

ESP32驱动TFT屏幕实战:LVGL与TFT_eSPI完美结合

本文详细介绍了如何在ESP32上结合TFT_eSPI驱动库与LVGL图形库,实现高效、流畅的嵌入式GUI开发。内容涵盖硬件连接、软件环境搭建、库配置、LVGL移植、界面创建及性能优化等全流程实战指南,帮助开发者快速构建低成本、高性能的交互式显示应用。

weixin_29206669的博客 200

FPGA实现DDR接口

verilog// DDR2控制器状态机// 初始化序列// 发出初始化命令endendendend// 自动预充电end// 其他状态...endcaseendend。

whm128的博客 1002

在单文档程序中动态切换多个窗体的源码程序

软件说明: 摘要:本文通过一个程序实例描述了在VC++6.0下如何在单文档程序中通过菜单动态控制多 个窗体的切换。    一、 引言    我们在编制程序中根据需求的不同会在程序风格上选择多文档、单文档或是对话框模式 ,对于单文档模式可能是我们使用比较多的,但有时我们想采用单文档的形式显示多个不同 的窗体,如作为数据库前台应用程序就会遇到此类问题,数据库由大量的表单组成,而同常 一个...

huozheleisi 419

回归预测 | MATLAB实现基于贝叶斯线性回归(Bayesian Regression)的多变量输入回归预测

回归预测 | MATLAB实现基于贝叶斯线性回归(Bayesian Regression)的多变量输入回归预测

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 2202
上一篇: .Net环境水晶报表在98下发布,出现"不能加载报表..."问题的解决
下一篇: 一个人的奋斗历程
仰泳的鱼儿
博客等级 码龄24年 42粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值