MFC分割窗口出现assertion failed, winsplit.cpp Line:367

guzi19801130 2017-08-04 03:17:02
在VS2010的C++环境中的MFC中,创建分割窗口:
1、在MainFrm.h文件中的CMainFrame 类中加入:
protected: // control bar embedded members
CSplitterWnd m_Sp1; //分割成两个窗口
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
2、在类视图中创建新类:
class CControlForm : public CFormView
3、再MainFrm.cpp文件中重写OnCreateClient 函数,并加入头文件#include "ControlForm.h":
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{

int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
float m_bKuanPin=float(cy)/float(cx);

//将主窗口分为一行两列
if(m_Sp1.CreateStatic(this,1,2)==NULL)
return FALSE;
}

为什么编译能成功,当运行EXE文件时,报断言错误:assertion failed, winsplit.cpp Line:367。
还请老师指教!!!
...全文
507 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenxi5251 2017-11-16
  • 打赏
  • 举报
回复
遇到同样问题,请教版主如何解决的?
QQ116155 2017-09-20
  • 打赏
  • 举报
回复
本人QQ957370524,实验室项目,求解
QQ116155 2017-09-20
  • 打赏
  • 举报
回复
怎么解决的,我也遇到这个问题了,求解啊
guzi19801130 2017-08-04
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:
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; } 就是没有创建 view
好的好的 非常感谢啊 老师 !!!
schlafenhamster 2017-08-04
  • 打赏
  • 举报
回复
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; } 就是没有创建 view
guzi19801130 2017-08-04
  • 打赏
  • 举报
回复
引用 9 楼 schlafenhamster 的回复:
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; } BOOL CSplitterWnd::IsChildPane(CWnd* pWnd, int* pRow, int* pCol) { ASSERT_VALID(this); ASSERT_VALID(pWnd); UINT nID = _AfxGetDlgCtrlID(pWnd->m_hWnd); if (IsChild(pWnd) && nID >= AFX_IDW_PANE_FIRST && nID <= AFX_IDW_PANE_LAST) { if (pRow != NULL) *pRow = (nID - AFX_IDW_PANE_FIRST) / 16; if (pCol != NULL) *pCol = (nID - AFX_IDW_PANE_FIRST) % 16; ASSERT(pRow == NULL || *pRow < m_nRows); ASSERT(pCol == NULL || *pCol < m_nCols); return TRUE; } else { if (pRow != NULL) *pRow = -1; if (pCol != NULL) *pCol = -1; return FALSE; } } 哪一句?
第367行,指向的是: ************** return pView; } BOOL CSplitterWnd::IsChildPane(CWnd* pWnd, int* pRow, int* pCol) { ********************* 中间的空行
schlafenhamster 2017-08-04
  • 打赏
  • 举报
回复
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; } BOOL CSplitterWnd::IsChildPane(CWnd* pWnd, int* pRow, int* pCol) { ASSERT_VALID(this); ASSERT_VALID(pWnd); UINT nID = _AfxGetDlgCtrlID(pWnd->m_hWnd); if (IsChild(pWnd) && nID >= AFX_IDW_PANE_FIRST && nID <= AFX_IDW_PANE_LAST) { if (pRow != NULL) *pRow = (nID - AFX_IDW_PANE_FIRST) / 16; if (pCol != NULL) *pCol = (nID - AFX_IDW_PANE_FIRST) % 16; ASSERT(pRow == NULL || *pRow < m_nRows); ASSERT(pCol == NULL || *pCol < m_nCols); return TRUE; } else { if (pRow != NULL) *pRow = -1; if (pCol != NULL) *pCol = -1; return FALSE; } } 哪一句?
xinhaoda 2017-08-04
  • 打赏
  • 举报
回复
断言错误可以在Dug的堆栈能够看到有用信息
guzi19801130 2017-08-04
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	CRect rect;
	GetClientRect(&rect);
	CSize size(rect.Width()/3,(rect.Height()-46)/2);
// create m_wndSplitter 2,3
	if (!m_wndSplitter.CreateStatic(this, 2,3)) return FALSE;
	m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CYaChangeSplitView), size, pContext);
	m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CYaChangeSplitView), size, pContext);
	m_wndSplitter.CreateView(0, 2, RUNTIME_CLASS(CYaChangeSplitView), size, pContext);
	m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CYaChangeSplitView), size, pContext);
	m_wndSplitter.CreateView(1, 1, RUNTIME_CLASS(CYaChangeSplitView), size, pContext);
	m_wndSplitter.CreateView(1, 2, RUNTIME_CLASS(CYaChangeSplitView), size, pContext);
非常感谢 不过还是EXE断言错误:assertion failed  winsplit.cpp Line:367 是不是项目配置哪里出了毛病
schlafenhamster 2017-08-04
  • 打赏
  • 举报
回复

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	CRect rect;
	GetClientRect(&rect);
	CSize size(rect.Width()/3,(rect.Height()-46)/2);
// create m_wndSplitter 2,3
	if (!m_wndSplitter.CreateStatic(this, 2,3)) return FALSE;
	m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CYaChangeSplitView), size, pContext);
	m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CYaChangeSplitView), size, pContext);
	m_wndSplitter.CreateView(0, 2, RUNTIME_CLASS(CYaChangeSplitView), size, pContext);
	m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CYaChangeSplitView), size, pContext);
	m_wndSplitter.CreateView(1, 1, RUNTIME_CLASS(CYaChangeSplitView), size, pContext);
	m_wndSplitter.CreateView(1, 2, RUNTIME_CLASS(CYaChangeSplitView), size, pContext);
guzi19801130 2017-08-04
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
打开 winsplit.cpp 看看 Line:367 cx*3/5 改 cx/5*3 或者 (cx*3)/5 ;因为 3/5 可能为0 !
不是的,在BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { if(m_Sp1.CreateStatic(this,1,2)==NULL) return FALSE; } 函数中,只有一个创建m_Sp1.CreateStatic命令,EXE也会assertion failed  winsplit.cpp Line:367
schlafenhamster 2017-08-04
  • 打赏
  • 举报
回复
打开 winsplit.cpp 看看 Line:367 cx*3/5 改 cx/5*3 或者 (cx*3)/5 ;因为 3/5 可能为0 !
guzi19801130 2017-08-04
  • 打赏
  • 举报
回复
创建了,添加上 “m_Sp1.CreateView(0,1,RUNTIME_CLASS(CControlForm),CSize(cx*3/5-15,cy), pContext);” EXE也是assertion failed winsplit.cpp Line:367
schlafenhamster 2017-08-04
  • 打赏
  • 举报
回复
m_Sp1 没有创建 View ?
赵4老师 2017-08-04
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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