我在一个对话框的一个按钮点击后弹出另外一个对话框,然后在弹出的对话框类中希望得到我切割过视图后的其中一个视图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,并不是空啊。请各位帮忙看看,多谢了!
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,并不是空啊。请各位帮忙看看,多谢了!
解决方案 »
- win32 怎么样给菜单项发送消息
- 资源共享:魔兽键盘修改(改键不影响聊天)
- 高分求解excel数据源操作的奇怪问题
- 请推荐几本由浅入深的控件开发的书籍!
- 谁给我讲讲keepalive吧
- 有关Photoshop杂色算法问题,请救救我呀!!
- 如果在Guest用户下执行管理员权限的代码?CreateProcessAsUser的用法
- MSDN能安装在WINDOWS XP上吗?
- 在键盘hook中按键处理函数中if(lParam&0x80000000)是什么意思啊!!msdn中对lParam参数的说明看不懂
- 拦截网页数据包(网页一直无法连接)(急)
- 请问如何创建一个目录并可以随程序运行存储文件
- 用GDI在创建的一个Bitmap上作的图形,可以直接存成JPG格式的么?
( (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.
}
1.你是在Dialog中调用的切分的视图类,要包含该视图类的头文件
2.你的m_splitter2声明的方式看一看,如果是Private的自己想想为什么不行
3.你从另一个视图调用该视图指针没有问题这是很正常的事情
4.ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。
5.ASSERT_VALID是判断里面的指针是否为空,你说的0x004a6d5c这是内存地址,它里面的内容一定是空的,说明你的m_splitter2.GetPane得到的指针是空的,或者说根本就不存在,明白否?
CMainFrame *pMainFrm = (CMainFrame *)AfxGetMainWnd();
CFrameWnd *pChildFrm = pMainFrm->GetActiveFrameWnd();
if(pChildFrm != NULL)
{
CWnd *pView = pChildFrm->GetActiveView();//OK, That's you need.
}
能不能说的具体一点,这样好象得不到我想要的CMediaView类指针,而得到CView1的指针,因为我切割过有好几个view。
十分感谢你耐心仔细的分析。
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。还请再帮我分析一下。
{
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!