一个文档,多个视,不能获得文档指针

tangsqd 2009-08-23 08:31:42
一个文档,多个视,不能获得文档指针。
在BOOL CEmluator200App::InitInstance()中:
m_pCpuViewTemplate= new CMultiDocTemplate(IDR_CPUFRAME,
RUNTIME_CLASS(CEmluator200Doc),------!
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CCpuView));
AddDocTemplate(m_pCpuViewTemplate);
m_pIbViewTemplate= new CMultiDocTemplate(IDR_IBFRAME,
RUNTIME_CLASS(CEmluator200Doc),------!
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CIbView));
AddDocTemplate(m_pIbViewTemplate);
在void CEmluator200App::OnFileNew() 中:
CFrameWnd* pNewFrame = m_pCpuViewTemplate->CreateNewFrame(NULL, NULL);
if (pNewFrame == NULL)
return ;
m_pCpuViewTemplate->InitialUpdateFrame(pNewFrame, NULL);

// Tile the two MDI children windows within the MDI frame window.
ASSERT_KINDOF(CMDIChildWnd, pNewFrame);
CMDIFrameWnd* pMDIFrameWnd = ((CMDIChildWnd*)pNewFrame)->GetMDIFrame();
ASSERT(pMDIFrameWnd != NULL);
在void CMainFrame::OnIdleUpdateCmdUI()中:
CMDIChildWnd* pChild = MDIGetActive();
if ( pChild )
{
CView *pView = pChild->GetActiveView();
if ( pView )
{
CDocument* pDoc = pView->GetDocument();//MDIGetActive()->GetActiveView()->GetDocument()

ASSERT_VALID(pDoc);-------》》》!!为空
if ( pDoc )
{
CDocTemplate* pDocTemplate = pDoc->GetDocTemplate();
if ( pDocTemplate )
{
// Class to extract the m_nIDResource member
class CHelperDocTemplate : public CDocTemplate
{
public:
CHelperDocTemplate():CDocTemplate(0,
NULL, NULL, NULL){}
UINT GetResourceId(){return m_nIDResource;}
};
CHelperDocTemplate* pHelper = (
CHelperDocTemplate*) pDocTemplate;
UINT n = pHelper->GetResourceId();
if ( SelectToolBar(IDR_CPUFRAME) ) return;
}
}
}
}

在Cpuview中
CEmluator200Doc* GetDocument()
{
// ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CEmluator200Doc)));
return (CEmluator200Doc*) m_pDocument;
}
也不行。
试了不但在OnIdleUpdateCmdUI中不能获得,其他地方也不行。
...全文
141 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
tangsqd 2009-09-02
  • 打赏
  • 举报
回复
本身帖子有点问题。马上结贴了,有好意见的,再顶一下。
dengxuxing 2009-08-24
  • 打赏
  • 举报
回复
你下载这个来看看吧,应该对你有用的:
http://download.csdn.net/source/1442385
副组长 2009-08-23
  • 打赏
  • 举报
回复
哪个指针? 实在不行你就得单独做一个DOC一个VIEW的多文档,这样取一遍看看你能不能取来了。
tangsqd 2009-08-23
  • 打赏
  • 举报
回复
to 13楼
得到的还是空指针
雪影 2009-08-23
  • 打赏
  • 举报
回复
3楼的办法可以的,你的是多文档,多视图,也只能这样的了
副组长 2009-08-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 tangsqd 的回复:]
13楼的办法也不行。

[/Quote]
哪一步有问题?
tangsqd 2009-08-23
  • 打赏
  • 举报
回复
13楼的办法也不行。
副组长 2009-08-23
  • 打赏
  • 举报
回复
你这是两个单独的Doc/View,获得文档指针就容易了。

1,GetMainFrame
2, GetActiveFrame,获得活动的ChildFrame
3,GetActiveView
4,GetDoccument
副组长 2009-08-23
  • 打赏
  • 举报
回复
你虽然使用的是一个文档类,但是你使用了2个实例对象,其实还是两个文档。

一个文档多视可以使用分裂窗,每个窗口对应一个View , 如果你不喜欢分裂窗口,可以添加Pane,可停靠的窗口,也可以一个窗口对应一个视。这样做都是比较方便的做法,尤其是Pane浮动的时候和普通窗口基本没什么两样。具体做时可以先从CView等基类派生一个View类,动态创建类对象。然后将这个类对象Attach到Doc类上,这时Doc就有两个类了。

MoXiaoRab 2009-08-23
  • 打赏
  • 举报
回复
8#讲错了,没那个 position的
MoXiaoRab 2009-08-23
  • 打赏
  • 举报
回复
CWinApp::GetFirstDocTemplate()获得第一个文档模板
然后用CWinApp::GetNextDocTemplate()来向下推指针

试试
tangsqd 2009-08-23
  • 打赏
  • 举报
回复
//
// ////利用CDocTemplate、CDocument和CView之间的存取关系,遍历整个文档模板、文档以及视。
// CEmluator200App *pMyApp = (CEmluator200App *)AfxGetApp();
// POSITION p = pMyApp->GetFirstDocTemplatePosition();
// while(p!= NULL) {
// CDocTemplate * pDocTemplate = pMyApp->GetNextDocTemplate(p);
// POSITION p1 = pDocTemplate->GetFirstDocPosition();
// while(p1 != NULL) {
// CDocument * pDocument = pDocTemplate->GetNextDoc(p1);
// POSITION p2 = pDocument->GetFirstViewPosition();
// while(p2 != NULL) {
// CView * pView = pDocument->GetNextView(p2);
// }
// }
// }
也不行
雪影 2009-08-23
  • 打赏
  • 举报
回复
1. afxgetapp()->m_pmainwnd为框架窗口指针;
2. 用cwinapp::getfirstdoctemplatepostion、
3. cwinapp::getnextdoctemplate来遍历所有文档模板

使用这种方式来获取文档指针
tangsqd 2009-08-23
  • 打赏
  • 举报
回复
又看了一下chkbook,是两个doc template.但怎么不能获得文档指针呢?
雪影 2009-08-23
  • 打赏
  • 举报
回复
但是你这么创建的可不是只有一个文档,存在多个文档了。
tangsqd 2009-08-23
  • 打赏
  • 举报
回复
根据msdn中chkbook来的。我不能用使用CSplitterWnd在子框架中分割多个视图,要一个一个的子窗口。
雪影 2009-08-23
  • 打赏
  • 举报
回复
看了你的代码,你创建的可不是一个文档啊。
你创建了两个文档,两个视图,两个子框架。

一个文档多个视图不是这么创建的。
一个文档多个视图一般是使用CSplitterWnd在子框架中分割多个视图。
雪影 2009-08-23
  • 打赏
  • 举报
回复
看了你的代码,你创建的可不是一个文档啊。
你创建了两个文档,两个视图,两个子框架。

一个文档多个视图不是这么创建的。
一个视图多个文档一个使用CSplitterWnd在子框架中分割多个视图。
tangsqd 2009-08-23
  • 打赏
  • 举报
回复
以后也不行,设了断点,一直没反应呀。OnIdleUpdateCmdUI一直在活动呀
arong1234 2009-08-23
  • 打赏
  • 举报
回复
也许你调用太早,此时view和doc之间的关系还没有绑定好

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧