关于切分视图,基本上成了,但是还有个毛病,不知原因在哪儿!

qiek 2004-12-19 02:59:26

CMainFrame类里:

CSplitterWnd m_wndSplitter;
CSplitterWnd m_wndSplitter2;


BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
//切分为两列
if (!m_wndSplitter.CreateStatic(this, 1, 2))
return FALSE;

if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftForm),
CSize(100, 100), pContext))
{
m_wndSplitter.DestroyWindow();
return FALSE;
}

//右边默认是CRightForm表单视图
if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRightForm),
CSize(100, 100), pContext))
{
m_wndSplitter.DestroyWindow();
return FALSE;
}

CRect r;
GetClientRect(&r);
//宽度1:4
m_wndSplitter.SetColumnInfo( 0, r.Width()/5, 0 );
m_wndSplitter.RecalcLayout();

return TRUE;
}

//右边再切分为两行视图(上边为CRight1Form,下边为CRight2Form)
void CMainFrame::OnViewRight12()
{
// TODO: Add your command handler code here
CWnd * pWnd = m_wndSplitter.GetPane(0,1);

if(pWnd != NULL && pWnd->IsKindOf(RUNTIME_CLASS(CRightForm)))
{

m_wndSplitter.DeleteView(0, 1);

if( !m_wndSplitter2.CreateStatic( &m_wndSplitter, 2, 1, WS_CHILD | WS_VISIBLE, m_wndSplitter.IdFromRowCol(0,1) ) )
return;

if( !m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CRight1Form), CSize(100,200), NULL) )
return;
if( !m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CRight2Form), CSize(100,0), NULL) )
return;
m_wndSplitter.RecalcLayout( );
}

return;
}

//把右边切分为一个视图(CRightForm)
void CMainFrame::OnViewRight()
{
//
CWnd * pWnd = m_wndSplitter.GetPane(0,1);
if (pWnd != NULL && pWnd->IsKindOf(RUNTIME_CLASS(CSplitterWnd)))
{
pWnd = NULL;
m_wndSplitter2.DestroyWindow();
m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRightForm),CSize(0, 0), NULL);
m_wndSplitter.RecalcLayout();
}

}


结果出现以下问题:
程序启动后,显示为左右两列,第一列为LeftForm,第二列为RightForm
执行OnViewRight12() 将第二列化分为上下两行,上面是Right1Form,下面是Right2Form,正常。
执行OnViewRight() 将第二列重置为RightForm,正常。
再执行OnViewRight12() ,结果出错!!!

请高手指出错在哪儿了,还缺什么吗?

可以提供程序源代码,我的Email: qiek@263.net
...全文
207 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tzq111 2004-12-25
  • 打赏
  • 举报
回复
搞定,请注意查收邮箱。
qiek 2004-12-22
  • 打赏
  • 举报
回复
代码见 :http://www.heishui.com/qiek/SplitTest.rar
再描述一遍:(简言:操作菜单中两个切换菜单来回操作出错)

程序启动后,显示为左右两列,第一列为LeftForm,第二列为RightForm
执行OnViewRight12() 将第二列化分为上下两行,上面是Right1Form,下面是Right2Form,正常。
执行OnViewRight() 将第二列重置为RightForm,正常。
再执行OnViewRight12() ,结果出错!!!
qiek 2004-12-21
  • 打赏
  • 举报
回复
我的QQ:762313

欢迎向我索要源代码。

如果能解决问题,给300分!
msm 2004-12-21
  • 打赏
  • 举报
回复
pWnd = NULL。一般这个称为野指针。删除指针不要这么做
改用delete。
在第二次划分前应该确认上次的分割句柄删除
tzq111 2004-12-21
  • 打赏
  • 举报
回复
发过来tzq_111@163.com,抱仕么错?

Kudeet 2004-12-20
  • 打赏
  • 举报
回复
m_wndSplitter.DeleteView(0,1); //在函数里先把原来的视图删除了再重新建立
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CWageItemView),CSize(0,0),NULL);
m_wndSplitter.RecalcLayout();
fengqinggao 2004-12-20
  • 打赏
  • 举报
回复
在你的OnViewRight()函数中,不知道为什么要这个语句:pWnd = NULL;,这样实际上是将m_wndSplitter.GetPane(0,1)(即第二列)的指针置为空了,好像有点不对劲,删除看看,呵呵,未经测试,打扰了,:)
qiek 2004-12-19
  • 打赏
  • 举报
回复
再请高手指点
I_Love_CPP 2004-12-19
  • 打赏
  • 举报
回复
请注意查收邮箱。
qiek 2004-12-19
  • 打赏
  • 举报
回复
收了,你的代码只是实现了切分,和我的要求不一样。
在我的代码中也实现了切分。关键在第二次切换时出错(第一次正常)。请看好了。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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