您的位置:首页 > 其它

MFC 单文档多视图实现(不是完全原创的,但是也不是直接转的,核心看法原创)

2013-04-01 13:11 288 查看
下面是在主要实现代码和注释

CView *pOldView  = GetActiveView();//获得活动视图
ASSERT(pOldView);
CView *pNewView = NULL;
if(pOldView->IsKindOf(RUNTIME_CLASS(CCSigleTest1View)))//当前活动视图是默认的视图
{
pNewView == (CView *)GetDlgItem(IDW_PANE_SECOND_MY);
if(pNewView == NULL)
{
//创建
pNewView = (CView *)(RUNTIME_CLASS(CMyView)->CreateObject());//创建对象用New关键字也可以
if(pNewView == NULL)
{
return;
}
CCreateContext context;//视图窗口上下文——用于将文档与新创建的视图关联,没有文档没法创建视图
context.m_pCurrentDoc = pOldView->GetDocument();
pNewView->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,CRect(0,0,0,0),this,IDW_PANE_SECOND_MY,&context);
pNewView->OnInitialUpdate();
}
}
//要显示的视图必须设置ID=AFX_IDW_PANE_FIRST
//不需要显示的视图设置为其它即可
pNewView = (CView *)GetDlgItem(IDW_PANE_SECOND_MY);
SetActiveView(pNewView);//设置当前活动视图——很重要
pNewView->ShowWindow(SW_SHOW);//显示视图、隐藏旧
pOldView->ShowWindow(SW_HIDE);
pNewView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);//要显示的视图设置此ID
pOldView->SetDlgCtrlID(IDW_PANE_SECOND_MY);//其它视图设置其它ID
RecalcLayout();	//重新布局


实现类:CMainFrame ——框架类管理视图最好不过,视图为框架的子窗口,所以推荐这种用法,其它的都可以。

消息映射:ON_COMMAND(ID_CHANG,&CMainFrame::ChangeView)

宏定义 #define IDW_PANE_SECOND_MY 32779——此处我放在了resource.h中,这个数值很重要,要是被别的窗口用了这个ID

你的程序会异常的没法运行,主要是不同的窗口都有ID调用GetDlgItem获得的对象可能不是你要的视图

重要提示:核心思想是利用CCreateContext视图文档上下文,将创建的视图与文档关联起来。
CMyView为自定义继承CView类,其它类都是工程默认类。


说明:上面的代码可以实现来回切换,具体的逻辑自己看,主要借鉴别人的代码,若侵犯您的权利,及时指正修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: