我在一个对话框的一个按钮点击后弹出另外一个对话框,然后在弹出的对话框类中希望得到我切割过视图后的其中一个视图CMediaServerView,代码如下:
CMediaServerView* Cserchrlt::GetMediaServerView()
{
  CMediaServerApp* pApp=(CMediaServerApp*)AfxGetApp();
  CMainFrame* pFrame=(CMainFrame*)pApp->m_pMainWnd;
  CMediaServerView* pView = (CMediaServerView*)pFrame->m_wndSplitter2.GetPane(0,0);  
  return pView;
}
结果老在第三行时出现断言失败的错误。
跟到下面函数:
CWnd* CSplitterWnd::GetPane(int row, int col) const
{
ASSERT_VALID(this); CWnd* pView = GetDlgItem(IdFromRowCol(row, col));
ASSERT(pView != NULL);  // panes can be a CWnd, but are usually CViews
return pView;
}时第一行断言失败
但this指针当时值为:0x004a6d5c,并不是空啊。请各位帮忙看看,多谢了!

解决方案 »

  1.   

    指针不为空不代表ASSERT_VALID(this)不会失败。应该是m_wndSplitter2有问题。
      

  2.   

    //×¢Òâ CFrameWnd¸ù¾Ý¾ßÌåµÄÀàÃû²»Í¬
    ( (CFrameWnd *) AfxGetApp() -> m_pMainWnd ) -> GetActiveDocument();(((CMainFrame*)AfxGetMainWnd())->m_wndSplitter.DoKeyboardSplit());( (CFrameWnd *) AfxGetApp() -> m_pMainWnd ) -> GetActiveView();/////////////////////////
    CMainFrame* pMainFrame = (CMainFrame*)(::AfxGetApp()->GetMainWnd());pMainFrame->m_wndStatusBar.SetPaneText( 0, "²âÊÔһϡ«" );//////////////////////////////////////
    ((CMainFrame*)AfxGetMainWnd())->SetMessageText("testasdf");///////////////////////////////////////
    CStatusBar* pStatus = (CStatusBar*)(AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR));///////////////////////////////////////
    CString sMessageText = ((CStatusBar*)((CMainFrame*)AfxGetMainWnd())->GetMessageBar())->GetPaneText(0);CMainFrame *pMainFrm = (CMainFrame *)AfxGetMainWnd();
    CFrameWnd *pChildFrm = pMainFrm->GetActiveFrameWnd();//Õâ¸ö»ñÈ¡µ±Ç°»î¶¯µÄÊÓͼµÄCChildFrame
    //Èç¹ûÊǵ¥ÎĵµÊÓͼ¾ÍûÓбØÒª»ñÈ¡Õâ¸öCChildFrameÁË,Ö±½Ó»ñÈ¡µ±Ç°»î¶¯µÄÊÓͼ¾Í¿ÉÒÔÁË         
    if(pChildFrm != NULL)
    {
      CWnd *pView = pChildFrm->GetActiveView();//OK, That's you need.
    }
      

  3.   

    简单一点说:
    1.你是在Dialog中调用的切分的视图类,要包含该视图类的头文件
    2.你的m_splitter2声明的方式看一看,如果是Private的自己想想为什么不行
    3.你从另一个视图调用该视图指针没有问题这是很正常的事情
    4.ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE  (0),  程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。
    5.ASSERT_VALID是判断里面的指针是否为空,你说的0x004a6d5c这是内存地址,它里面的内容一定是空的,说明你的m_splitter2.GetPane得到的指针是空的,或者说根本就不存在,明白否?
      

  4.   

    wangjia184,你的有效代码是不是下面这些:
    CMainFrame *pMainFrm = (CMainFrame *)AfxGetMainWnd();
    CFrameWnd *pChildFrm = pMainFrm->GetActiveFrameWnd();       
    if(pChildFrm != NULL)
    {
      CWnd *pView = pChildFrm->GetActiveView();//OK, That's you need.
    }
    能不能说的具体一点,这样好象得不到我想要的CMediaView类指针,而得到CView1的指针,因为我切割过有好几个view。
      

  5.   

    to LeiShi(leizi) :
    十分感谢你耐心仔细的分析。
    1、2的情况都是不存在的。那么我怎么样才可以得到我需要的视图类指针呢?
    CMediaServerView* Cserchrlt::GetMediaServerView()
    {
    CMediaServerApp* pApp=(CMediaServerApp*)AfxGetApp();
    CMainFrame* pFrame=(CMainFrame*)pApp->m_pMainWnd;    
    CMediaServerView* pView = (CMediaServerView*)pFrame->GetActiveView(); 
    return pView;
    }
    我用上面的代码得到CView1的指针,得不到我想要的CMediaView类指针,可见当前活动的视图是CView1。还请再帮我分析一下。
      

  6.   

    举个例子说明我在这里将视图分割成三份,左边一竖条,右边横着分成两块,使用了两个m_splitter。CInfoListView* CMainFrame::GetListView()
    {
    CWnd* pWnd = m_wndSplitter2.GetPane(1, 0);
    CInfoListView* pView = DYNAMIC_DOWNCAST(CInfoListView, pWnd);
    return pView;
    }CInfoFormView* CMainFrame::GetFormView()
    {
    CWnd* pWnd = m_wndSplitter2.GetPane(0, 0);
    CInfoFormView* pView = DYNAMIC_DOWNCAST(CInfoFormView, pWnd);
    return pView;
    }CImgLibManagerView *CMainFrame::GetTreeView()
    {
    CWnd *pWnd = m_wndSplitter.GetPane(0, 0);
    CImgLibManagerView *pView = DYNAMIC_DOWNCAST(CImgLibManagerView, pWnd);
    return pView;
    }这些代码是说明如何在获得你想使用的视图指针,呵呵:)接下来你自己分析一下你自己想要做什么,参考一下这个。Try it!