C++--深入分析MFC文档视图结构(项目实践)
访问对象
|
访问位置
|
访问实现
|
应用程序 App
|
任何位置
|
① AfxGetApp();
② 在要使用应用程序 App 的文件中加入:
extern CAApp theApp ,然后直接使用全局的 theApp 变量。
|
主框架窗口
|
任何位置
|
① AfxGetMainWnd();
② AfxGetApp()->m_pMainWnd;
|
视图
|
框架类中
|
GetActiveView();// 当前的活动视图
|
文档类中
|
GetFirstViewPosition (); // 可以获取全部视图
GetNextView ();
|
|
文档
|
文档类中
|
GetDocument() ;
|
文当模版类中
|
GetFirstDocPosition(); // 该文档模版对应全部文档
GetNextDoc();
|
|
框架类中
|
GetActiveDocument(); // 当前活动文当
|
|
子框架类( MDI 中)
|
主框架类中
|
① MDIGetActive ();
② GetActiveFrame ();
|
视图类中
|
GetParentFrame();
|
|
文档模版
|
文档类中
|
GetDocTemplate();
|
应用程序 App 中
|
GetFirstDocTemplatePosition();
GetNextDocTemplate();
|
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CMainFrame),// main SDI frame window
RUNTIME_CLASS(CTestView));
AddDocTemplate(pDocTemplate);
|
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_TESTTYPE,
RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CTestView));
AddDocTemplate(pDocTemplate);
|
CMultiDocTemplate* m_pDocTemplate;
m_pDocTemplate = new CMultiDocTemplate(
IDR_TESTTYPE,// 改为你新建的菜单资源 ID
RUNTIME_CLASS(CTestDoc),// 改为你新建的文档类
RUNTIME_CLASS(CChildFrame), // 改为你新建的框架类
RUNTIME_CLASS(CTestView));// 改为你新建的视图类
AddDocTemplate(m_pDocTemplate);
|
CMultiViewDoc* CAnotherView::GetDocument()
{
return (CMultiViewDoc*)m_pDocument;
}
|
private:
CView* m_pFirstView;
CView* m_pAnotherView;
|
…….
// 创建一个新的视图
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);
……
|
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()
{
// 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();
}
|
pDC->TextOut(400,300,"First View");
pDC->TextOut(400,320,pDoc->GetTitle());
|
pDC->TextOut(400,300,"Another View");
pDC->TextOut(400,320,pDoc->GetTitle());
|
m_pAnotherView = new CAnotherView(); //new 一个新的视图,可以改为你新建的视图
// 获取一个已有的文档,可以是你新建的文档
CDocument* m_pDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument();
// 文档和视图关联
CCreateContext context;
context.m_pCurrentDoc = m_pDoc;
// 创建视图
UINT m_IDFORANOTHERVIEW = AFX_IDW_PANE_FIRST + 1; // 创建视图的 ID 号,你可以自己设置
CRect rect;
m_pAnotherView->Create(NULL, NULL, WS_CHILD, rect, m_pMainWnd, m_IDFORANOTHERVIEW, &context);
|
CChildFrame * pFrm = new CChildFrame();// 框架可以是你新建或者定制的框架类
CCreateContext context;
context.m_pNewViewClass = RUNTIME_CLASS(CDemoView);// 视图可以是你想显示的视图
pFrm->LoadFrame(IDR_TEST2TYPE,WS_CHILD
WS_OVERLAPPEDWINDOW, this, &context);// 菜单资源你可以修改
pFrm->ShowWindow(SW_SHOW);// 显示窗口
pFrm->InitialUpdateFrame(NULL,true);// 调用视图的 OnInitialUpdate ()和框架的 ActiveFrame (),你可以在这里设置窗口的标题
|
context.m_pCurrentDoc = m_pDoc;// m_pDoc就是你要关联到的文档对象
|
HMENU m_hOPMenu;
HMENU m_hInitMenu;
|
m_hInitMenu = ::LoadMenu(hInst, MAKEINTRESOURCE(IDR_MAINFRAME));
m_hOPMenu = ::LoadMenu(hInst, MAKEINTRESOURCE(IDR_DEMOTYPE));
|
pFrame->SetWindowText(" 未登录 ");
m_nCmdShow = SW_SHOWMAXIMIZED;
pFrame->ShowWindow(m_nCmdShow);// 系统提供
pFrame->UpdateWindow();
|
void CDemoApp::OnLogin()
{
// TODO: Add your command handler code here
SetMenu(AfxGetApp()->m_pMainWnd->m_hWnd,m_hOPMenu);
AfxGetApp()->m_pMainWnd->SetWindowText(" 已登录 ");
}
|
void CDemoApp::OnLogout()
{
// TODO: Add your command handler code here
if(((CMainFrame *)AfxGetMainWnd())->m_pFuncOneFrame != NULL)
((CMainFrame *)AfxGetMainWnd())->m_pFuncOneFrame->SendMessage(WM_CLOSE);
if(((CMainFrame *)AfxGetMainWnd())->m_pFuncTwoFrame != NULL)
((CMainFrame *)AfxGetMainWnd())->m_pFuncTwoFrame->SendMessage(WM_CLOSE);
SetMenu(AfxGetApp()->m_pMainWnd->m_hWnd,m_hInitMenu);
AfxGetApp()->m_pMainWnd->SetWindowText(" 未登录 ");
}
|
CDemoFrame* m_pFuncOneFrame;
CDemoFrame * m_pFuncTwoFrame;
|
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
m_pFuncOneFrame = NULL;
m_pFuncTwoFrame = NULL;
}
|
void CMainFrame::OnFuncOne()
{
// TODO: Add your command handler code here
if (m_pFuncOneFrame != NULL)
{
m_pFuncOneFrame->MDIActivate();
return ;
}
m_pFuncOneFrame = new CDemoFrame();
CCreateContext context;
context.m_pNewViewClass = RUNTIME_CLASS(CFuncOneView);
m_pFuncOneFrame->LoadFrame(IDR_MAINFRAME, WS_MAXIMIZEWS_OVERLAPPEDWINDOW, this, &context);
m_pFuncOneFrame->SetWindowText(" 业务逻辑一 ");
m_pFuncOneFrame->ShowWindow(SW_SHOWMAXIMIZED);
m_pFuncOneFrame->InitialUpdateFrame(NULL,true);
}
|
void CMainFrame::OnFuncTwo()
{
// TODO: Add your command handler code here
if (m_pFuncTwoFrame != NULL)
{
m_pFuncTwoFrame->MDIActivate();
return ;
}
m_pFuncTwoFrame = new CDemoFrame();
CCreateContext context;
context.m_pNewViewClass = RUNTIME_CLASS(CFuncTwoView);
m_pFuncTwoFrame->LoadFrame(IDR_MAINFRAME, WS_MAXIMIZEWS_OVERLAPPEDWINDOW, this, &context);
m_pFuncTwoFrame->SetWindowText(" 业务逻辑二 ");
m_pFuncTwoFrame->ShowWindow(SW_SHOWMAXIMIZED);
m_pFuncTwoFrame->InitialUpdateFrame(NULL,true);
}
|
CString CDemoDoc::GetData()
{
return "Hello world";
}
|
CDemoDoc* CFuncOneView::GetDocument()
{
return (CDemoDoc*)m_pDocument;
}
|
void CFuncOneView::OnDraw(CDC* pDC)
{
//CDocument* pDoc = GetDocument();
// TODO: add draw code here
CDemoDoc* pDoc = GetDocument();
pDC->TextOut(50,50,pDoc->GetData());
}
|
void CMainFrame::OnFuncOne()
{
// TODO: Add your command handler code here
if (m_pFuncOneFrame != NULL)
{
m_pFuncOneFrame->MDIActivate();
return ;
}
m_pFuncOneFrame = new CDemoFrame();
CDemoDoc* m_pDoc = new CDemoDoc();
CCreateContext context;
context.m_pNewViewClass = RUNTIME_CLASS(CFuncOneView);
context.m_pCurrentDoc = m_pDoc;
m_pFuncOneFrame->LoadFrame(IDR_MAINFRAME, WS_MAXIMIZEWS_OVERLAPPEDWINDOW, this, &context);
m_pFuncOneFrame->SetWindowText(" 业务逻辑一 ");
m_pFuncOneFrame->ShowWindow(SW_SHOWMAXIMIZED);
m_pFuncOneFrame->InitialUpdateFrame(NULL,true);
}
|
转载于:https://www.cnblogs.com/duadu/archive/2007/08/26/6166671.html
C++--深入分析MFC文档视图结构(项目实践)相关推荐
- 深入分析MFC文档视图结构(项目实践)
文档视图结构(Document/View Architecture)是MFC的精髓,也是Observer模式的具体实现框架之一,Document/View Architecture通过将数据和其表示分 ...
- MFC文档/视图结构体系及SDI回顾(2)
1.牢骚发在最前面 三件事情杂糅到了一起弄得我彻夜未眠. 香港大学的Offer不小心丢在了垃圾邮箱里,却阴差阳错的来了清华.平台是一方面,当时谈好的港府奖学金也就此泡汤,这笔钱是我急需的. 惊闻噩耗, ...
- OpenCV+MFC文档视图结构 构建简易PS图像处理软件
简介 本文介绍了基于OpenCV图像处理库的MFC框架下的图像处理程序构建方法. 本项目依赖OpenCV库4.1.0版本,构建和编译由VS2017完成. 程序目录 simPS2.h/simPS2.cp ...
- 文档视图结构下多视图间的控制
程序结构: 创建了一个基于CFormView的MFC文档视图结构的程序,并用CSplitterWnd将窗口分割为2列,左边显示默认创建CFormView视图,右边是CHtmlView视图. 在CFor ...
- 玩转MFC文档视图架构编程1——深入浅出MFC文档/视图架构之基本概念深入浅出MFC文档/视图架构之文档
原创地址: 深入浅出MFC文档/视图架构之基本概念 http://iis.xrtvu.com/Tech/ShowArticle.asp?ArticleID=276 深入浅出MFC文档/视图架构之文档模 ...
- MFC让文档/视图结构程序支持滚动条
MFC让文档/视图结构程序支持滚动条 2009-06-30 09:26要通过滚动条显示文档,还必须知道文档滚动到了什么位置:一旦用户拖动滚动条时要告诉视图改变在文档中 的位置.所有这些,由MFC的CS ...
- MFC之文档/视图结构应用程序
文档/视图结构应用程序 一.文档/视图结构分析 MFC 通过多个类提供了对程序框架的支持,使用这些类可以简单地实现文档/视图结构:其中主要包括以下五个类: 应用程序类(CWinAPP):是 MFC 程 ...
- 视图切换—多模板文档视图结构的应用
转自:http://www.winu.cn/htmls/208/065/ 一.概述 ①在一个MDI程序中,需要使用到不同类型的子窗口,而每种类型窗口有可能有很多个,对应不同的数据. 这时,可以使用多模 ...
- 深入浅出MFC文档/视图架构之文档模板
在"文档/视图"架构的MFC程序中,提供了文档模板管理者类CDocManager,由它管理应用程序所包含的文档模板.我们先看看这个类的声明: / // CDocTemplate m ...
最新文章
- 谷歌服务中断事故能否避免?
- MFC界面库BCGControlBar v25.0新功能详解六:属性网格和其他
- django_rest_framework之GenericAPIView(二)之搜索、排序、分页讲解
- 网易智慧企业春招开幕:同心战疫,共盼花开
- 【ArcGIS Pro微课1000例】0006:ArcGIS Pro 2.5三维显示DEM数字高程模型
- 【数值分析】基础理论归纳
- 06_Influxdb+Grafana绘图基础
- 一加6手机突然没信号没服务器,如何从技术上解决手机信号问题?一加6替你想到了...
- 网抑云了是什么意思,网抑云语录有哪些,网抑云网抑云梗表情包
- 动态规划之字符串最短编辑距离
- 排序算法之 归并排序
- mysql or 速度_mysql中or和in的效率问题
- WebService学习总结(一)——WebService的相关概念
- TTS-零基础入门-10分钟教你做一个语音功能
- MCMC算法学习总结
- FishC笔记—29 讲 文件:一个任务
- Python Algorithms Learning Notes(1)--Asymptotic Notations
- oracle biee资料库,Hello oracle BIEE 资料
- html+字体有白色的重影+重影字体设置,LCD显示器显示模糊与字体有重影是什么原因...
- 部署tomcat之appBase和docBase
热门文章
- 【mysql问题】foreign key without name 解决方法
- 3.2.2 快速搭建你的第一个系统所,并进行迭代
- web页面到ajax,页面使用ajax加载页面后如果运行其中的js,webpack如何多页面展示...
- Java实现大数乘法_java实现大数加法、乘法(BigDecimal)
- servelet基础
- akka框架——异步非阻塞高并发处理框架
- 记录一些精品开源项目
- 设计模式 - 适配器模式
- iOS转让app-您必须移除要转让的 App 的所有构建版本和测试员,并清除“测试信息”下的所有信息字段解决方案...
- c\c++ 随机数函数