文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>由CHtmlView的OnDestroy引发的问题

由CHtmlView的OnDestroy引发的问题

时间:2010-10-09  来源:mmxida

最近在用MFC做小实验,用到了显示网页内容的CHtmlView类。在一个SDI的程序中,我继承了CHtmlView并创建了一个新类,然后把它添加到了一个TabCtrl里,测试发现,程序能使用Navigate2之类的方法实现显示特定的网页。但当我再调试模式下退出程序时,出现了访问违规。原来,虽然CHtmlView继承了CFormView,后者又继承自CView,但CHtmlView重写了OnDestroy方法,并在这个方法里什么也没做。

void CHtmlView::OnDestroy()
{
}

而在它的父类CFormView的OnDestory实现(实际上是继承了CView的实现)里却做了如下的工作:

void CView::OnDestroy()
{
        CFrameWnd* pFrame = GetParentFrame();
        if (pFrame != NULL && pFrame->GetActiveView() == this)
                pFrame->SetActiveView(NULL);    // deactivate during death
        CWnd::OnDestroy();
}

这个差异,便导致了程序退出时的崩溃。我还没找到这个问题是由于MFC库的Bug,还是我编写的程序没有依照文档视图规范,但我解决这个问题的方法是:重写CHtmlView的OnDestroy方法,如下:

void CMyHtmlView::OnDestroy()
{
      CHtmlView::OnDestroy();

       // 防止程序退出时的GetActiveView断言
     CFormView::OnDestroy();
}

 

另外,在使用CHtmlView的过程中,调试时会输出一些异常警告,

Warning: constructing COleException, scode = DISP_E_MEMBERNOTFOUND ($80020003).
Warning: constructing COleException, scode = DISP_E_MEMBERNOTFOUND ($80020003).

这个问题可以通过重写CHtmlView的OnSize方法解决:

void CMyHtmlView::OnSize(UINT nType, int cx, int cy)
{
                CFormView::OnSize(nType, cx, cy);    // 注意:这里是CFormView而不是CHtmlView

                // TODO: Add your message handler code here
                if (::IsWindow(m_wndBrowser.m_hWnd)) 
                { 
                    CRect rect; 
                    GetClientRect(rect); 
                    ::AdjustWindowRectEx(rect, GetStyle(), FALSE, WS_EX_CLIENTEDGE);
                    m_wndBrowser.SetWindowPos(NULL, 
                        rect.left, 
                        rect.top, 
                        rect.Width(), 
                        rect.Height(), 
                        SWP_NOACTIVATE | SWP_NOZORDER); 
                }
}


 

相关阅读 更多 +
排行榜 更多 +
枪战大乱斗2

枪战大乱斗2

飞行射击 下载
猎鸭挑战安卓版

猎鸭挑战安卓版

飞行射击 下载
空军

空军

飞行射击 下载