VC编程之VC项目开发之单文档多视图实现-非分割窗口
小标 2018-11-15 来源 : 阅读 843 评论 0

摘要:本文主要向大家介绍了VC编程之VC项目开发之单文档多视图实现-非分割窗口,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之VC项目开发之单文档多视图实现-非分割窗口,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

多视图是VC开发中经常要用到的技术之一,一般地实现单文档多视图有两种方式
1)通过视图分割的技术(使用CSplitterWnd实现),将窗口分割为多个部分,每个部分显示各自显示不同的视图,这种技术实现起来比较简单,并且相关的资料也很多。
2)通过一个文档关联多个视图,窗口显示整个视图。
 
第二种实现较第一种复杂,这里给出详细的实现方法。
Step 1:使用VC 6.0新建一个Project,命名为:MultiView。除选择单文档属性外,一切使用“默认”方式。于是你可以获得五个类:CMainFrame ,CMultiViewApp,CMultiViewDoc,CMultiViewView,和CAboutDlg;
 
Step 2:新建一个新的视图View,添加一个新的MFC Class(Insert->New Class),基类为CView(或者CView的派生子类,如CEditView等)。类的名字为CAnotherView,这就是新的视图;并为CAnotherView添加GetDocument的实现:

CMultiViewDoc* CAnotherView::GetDocument()
{
       return (CMultiViewDoc*)m_pDocument;
}

 
Step 3:在CMultiViewApp添加成员变量记录这两个视图:

private:

       CView* m_pFirstView;

       CView* m_pAnotherView;

 
给程序菜单IDR_MAINFRAME添加一个菜单项目“视图”,该菜单项有两个子菜单“视图一”和“视图二”,添加相应函数(void CMultiViewApp:: OnShowFirstview()和void CMultiViewApp:: OnShowSecondview());
 
Step 4:创建新的视图:在BOOL CMultiViewApp::InitInstance()中添加代码: 

…….

//创建一个新的视图
       CView* m_pActiveView = ((CFrameWnd*)m_pMainWnd)->GetActiveView();
       m_pFirstView = m_pActiveView;

       m_pAnotherView = new CAnotherView();

       //文档和视图关联
       CDocument* m_pDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument();

       CCreateContext context;
       context.m_pCurrentDoc = m_pDoc;

       //创建视图
       UINT m_IDFORANOTHERVIEW = AFX_IDW_PANE_FIRST + 1;
       CRect rect;
       m_pAnotherView->Create(NULL,NULL,WS_CHILD,rect,m_pMainWnd,

m_IDFORANOTHERVIEW,&context);

    ……

 
Step 5:现在已经创建了视图,并且都和文档关联起来了。现在要作的就是视图间的转换。在void CMultiViewApp:: OnShowFirstview()中添加实现代码:
 

void CMultiViewApp::OnShowFirstview()
{
       // TODO: Add your command handler code here
       UINT temp = ::GetWindowLong(m_pAnotherView->m_hWnd, GWL_ID);

    ::SetWindowLong(m_pAnotherView->m_hWnd, GWL_ID, ::GetWindowLong(m_pFirstView->m_hWnd, GWL_ID));
    ::SetWindowLong(m_pFirstView->m_hWnd, GWL_ID, temp);

 
       m_pAnotherView->ShowWindow(SW_HIDE);
       m_pFirstView->ShowWindow(SW_SHOW);


       ((CFrameWnd*)m_pMainWnd)->SetActiveView(m_pFirstView);
       ((CFrameWnd*) m_pMainWnd)->RecalcLayout();

    m_pFirstView->Invalidate();

}

 
在void CMultiViewApp:: OnShowSecondview()中添加实现代码:

void CMultiViewApp::OnShowSecondview()
{

       // TODO: Add your command handler code here
       UINT temp = ::GetWindowLong(m_pAnotherView->m_hWnd, GWL_ID);

    ::SetWindowLong(m_pAnotherView->m_hWnd, GWL_ID, ::GetWindowLong(m_pFirstView->m_hWnd, GWL_ID));

    ::SetWindowLong(m_pFirstView->m_hWnd, GWL_ID, temp);


       m_pFirstView->ShowWindow(SW_HIDE);

       m_pAnotherView->ShowWindow(SW_SHOW);     
 

       ((CFrameWnd*)m_pMainWnd)->SetActiveView(m_pAnotherView);

       ((CFrameWnd*) m_pMainWnd)->RecalcLayout();

    m_pAnotherView->Invalidate();

}

 
Step 6:为了演示,这里将不同的视图给予一个标记,在CMultiViewView和CAnotherView的OnDraw方法中分别添加以下代码:

pDC->TextOut(400,300,"First View");

       pDC->TextOut(400,320,pDoc->GetTitle());



pDC->TextOut(400,300,"Another View");

       pDC->TextOut(400,320,pDoc->GetTitle());

 
至此就大功告成了,但是实现过程中有4点说明:
1) 实现中由于使用到相关的类,因此在必要的地方要include相关的头文件,这里省略;CAnotherView的默认构造函数是Protected的,需要将其改为Public,或者提供一个产生CAnotherView对象的方法(因要创建视图对象);
2) 这里给出的是一个示例代码,实际开发中可以通过参考实现获得自己想要实现的具体应用情况(例如视图类的不同、数量不同,更重要的还有业务逻辑的不同实现等);
3) 本文的示例代码已上传到Blog,可以通过下面的地址获得代码。

以上就介绍了VC/MFC的学习,希望对VC/MFC有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程