中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 综合文章
CRichEditDoc在关闭非CRichEditView派生出来的视图时出现的问题
作者:未知 时间:2004-07-22 12:12 出处:Blog 责编:chinaitpower
              摘要:暂无

版本:Visual Studio 6.0 + Service Pack 5 下的MFC6

文档类:CRichEditDoc的派生类

视图类:包括CRichEditView派生类及非CRichEditView派生类在内的多个视图

问题:程序在关闭文档时出错。

分析:

在CDocument里
void CDocument::OnCloseDocument()
{
        while (!m_viewList.IsEmpty())
        {
                // get frame attached to the view
                CView* pView = (CView*)m_viewList.GetHead();
                ASSERT_VALID(pView);
                CFrameWnd* pFrame = pView->GetParentFrame();
                ASSERT_VALID(pFrame);
                // and close it
                PreCloseFrame(pFrame);
                pFrame->DestroyWindow();
                        // will destroy the view as well
        }
        ......
}
在CRichEditDoc里
CRichEditView* CRichEditDoc::GetView() const
{
        POSITION pos = GetFirstViewPosition();
        if (pos == NULL)
                return NULL;
        // find the first view that is a CRichEditView
        CView* pView;
        while (pos != NULL)
        {
                pView = GetNextView(pos);
                if (pView->IsKindOf(RUNTIME_CLASS(CRichEditView)))
                        return (CRichEditView*) pView;
        }
        // can't find one--return NULL
        return NULL;
}
void CRichEditDoc::PreCloseFrame(CFrameWnd* pFrameArg)
{
        ......
        // deactivate any inplace active items on this frame
        GetView()->m_lpRichEditOle->InPlaceDeactivate();   
................................................................1
        ......
}

可以发现,CDocument::OnCloseDocument在关闭每一个视图的时候总会调用PreCloseFrame来处理一些善后的工作,而CRichEditDoc::PreCloseFrame总调用CRichEditDoc::GetView() 来获得这些视图类的指针,但是CRichEditDoc::GetView() 只返回类型为CRichEditView派生类的视图对象的指针,这就造成CRichEditDoc::GetView() 在遇到非CRichEditView派生类的视图对象时候只是返回一个NULL,于是在1处程序出错,所以在这种情况下我们必须在CDocument::OnCloseDocument被调用之前手动关闭掉所有与CRichEditDoc相关联的非CRichEditView的派生类的视图。

我不知到这是不是微软特意这样做,总之在往CRichEditDoc里添加View后,关闭的
时候都要先手动关闭其他不是CRichEditView派生出来的View,不知各位有什么见解
^_^

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有