非文档/视图结构程序中拆分窗口的问题

时间:2022-04-24 21:29:32
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
     m_wndSplitter.CreateStatic(this,2,1);

     m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CView1),CSize(100,100),pContext);
     m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CView2),CSize(100,100),pContext);

     return TRUE;
}

运行时候程序非法退出,换到文档/视图结构程序就正常,难到拆分窗口必须要文档/视图结构的支持吗?网上找遍了都没找到答案,哪位高手知道呀?

22 个解决方案

#1


非文档/视图结构程序?
看你上面的代码,那你用的是什么结构?

#2


就在用向导生成框架时,没有选择 文档/视图结构支持

#3


也就是程序中没有文档类

#4


没人知道吗?自己先顶一下……

#5


if (m_wndSplitter.CreateStatic(this,2,1))
{
CRect rect;
GetClientRect(&rect);
CSize size = rect.Size();
size.cy-=150;
if (m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CChatView),size,pContext))
{
if (m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CSendView),CSize(0,0),pContext))
{
SetActiveView((CView*)m_wndSplitter.GetPane(1,0));
return TRUE;
}
}
}

#6


和有没有 选择 文档/视图结构支持 没关系。如果实在不行,第一个view用系统默认生成的那个类。

#7


你的cview1和cview2是不是从cview继承而来,如果是的话,则必须是文档/视图结构,否则会出错
如果不是文档/视图结构,则cview1和cview2应从cwnd继承

#8


谢谢大家的帮助,我新建了个单文档程序,没有选择“文档/视图结构支持”。
1.我试过了toxyboy(长的比较无奈) 的代码,还是要出错。
2.使用系统默认生成的View类,还是要出错。
3.CView1和CView2从CWnd派生,还是要出错。

如果大家有时间,能亲自实践一下吗?先谢谢了,这个问题我翻便了网络,找到一个和我一样的问题,但最后还是没解决。。。

#9


你的窗口切分,好象没有对其进行初始化和重新布局。


我只说我的方法:

你建的应该是基于多文档的工程,工程里有一个已有的CView类(例你的工程是test,它就为CTestView),你新建一个CView 类(假如为CDrawView),那么你在CChildFrame类中的OnCreateClient事件里添加以下代码即可:
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
// TODO: Add your specialized code here and/or call the base class
CRect rect;
this->GetWindowRect(&rect);
BOOL bRes=m_wndSplitter.CreateStatic(this,1,2);
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTestView),CSize(0,0),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CDrawView),CSize(0,0),pContext);
m_wndSplitter.SetColumnInfo(0,rect.Width()/2,10);
m_wndSplitter.SetColumnInfo(1,rect.Width()/2,10);//对切分的窗体进行初始化
m_wndSplitter.RecalcLayout();//对窗体进行重新布局
//return CMDIChildWnd::OnCreateClient(lpcs, pContext);
return bRes;
}

#10


我新建的工程确实是建立的单文档程序,没有选择“文档/视图结构支持”。
工程名:test
工程中自动有的类:CAboutDlg、CChildView、CMainFrame、CtestApp。

照您所说,我这样写:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
CRect rect;
this->GetWindowRect(&rect);
BOOL bRes=m_wndSplitter.CreateStatic(this,1,2);
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CView1),CSize(0,0),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CView2),CSize(0,0),pContext);
m_wndSplitter.SetColumnInfo(0,rect.Width()/2,10);
m_wndSplitter.SetColumnInfo(1,rect.Width()/2,10);//对切分的窗体进行初始化
m_wndSplitter.RecalcLayout();//对窗体进行重新布局
//return CMDIChildWnd::OnCreateClient(lpcs, pContext);
return bRes;
}

还是要出错。
可是只要是在建立工程时的向导里选择了“文档/视图结构支持”,就一切正常了,可是我现在做的东西是没有“文档/视图结构支持”的,又需要拆分窗口,真是急死人呐!

#11


从你上面的话里,我看你建的是多文档工程,因为你的自动类中出现了CChildView类。

我是过了你的方法,的确通不过。编译通过,但程序运行不了,出现系统的内存错误。

我将上面的代码放到CChildFrame下,运行正常了。

#12


我有个疑问,你说没有“文档/视图结构支持”的支持,是说在工程前期的设定基类选的不是CView吗?

#13


我建立的确实是单文档应用程序呀(向导第一步我选择的是单文档),单文档程序里面也有CChildView。
另外,我重新建立了个多文档的,照您的说法,还是编译通过,运行时候内存错误!
还有,我说的没有“文档/视图结构支持”是指,在向导第一步的时候,有个“文档/视图结构支持”(英文版的为“Document/View architecture support”),它前面的复选框没有选中。这样,在生成的自动类里面就没有文档类了。

#14


哦,对,是我搞错了。

我也是刚学的,可能帮不了你。

但是我只要将上面的代码放在CMainFrame里,就会出错,可能主窗口是不能用于切分的。

帮不了你了

#15


你可以找书vc++6.0技术内幕,上面有一个例子,照做一遍就可以了

#16


麻烦大家了,《vc++6.0技术内幕》这本书我买了的,上面的例子也是基于“文档/视图结构支持”的,我就从来没看到过不用“文档/视图结构支持”拆分窗口的,哎,这个问题真麻烦呀!

#17


实在不行只有自己写个类通过WM_SIZE来模拟了。。。不过自己写好麻烦。。。还不一定好。。。

#18


只要有VIEW类就可以的

#19


up

#20


我做过 类似的 非文档/视图结构程序中拆分窗口

只是没有用它的cview 而已 用自己的view类 成功

不过 确实有很多问题  所以建议最好不要做非文档的
因为它涉及 mfc底层的东西,而且存在mfc 的一个bug

编程编 的越多 mfc的 bug你将发现的越多

#21


不要用mfc的文档视图机制,业务与显示耦合太重,太烂了,自己写一个拆分窗口的类就行了,

#22


不要文档和视图结构也是可以的.就是在对话框里你也可以分割窗口出来.你看看CODEPROJECT上关于分割条的例子.挺详细的.

#1


非文档/视图结构程序?
看你上面的代码,那你用的是什么结构?

#2


就在用向导生成框架时,没有选择 文档/视图结构支持

#3


也就是程序中没有文档类

#4


没人知道吗?自己先顶一下……

#5


if (m_wndSplitter.CreateStatic(this,2,1))
{
CRect rect;
GetClientRect(&rect);
CSize size = rect.Size();
size.cy-=150;
if (m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CChatView),size,pContext))
{
if (m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CSendView),CSize(0,0),pContext))
{
SetActiveView((CView*)m_wndSplitter.GetPane(1,0));
return TRUE;
}
}
}

#6


和有没有 选择 文档/视图结构支持 没关系。如果实在不行,第一个view用系统默认生成的那个类。

#7


你的cview1和cview2是不是从cview继承而来,如果是的话,则必须是文档/视图结构,否则会出错
如果不是文档/视图结构,则cview1和cview2应从cwnd继承

#8


谢谢大家的帮助,我新建了个单文档程序,没有选择“文档/视图结构支持”。
1.我试过了toxyboy(长的比较无奈) 的代码,还是要出错。
2.使用系统默认生成的View类,还是要出错。
3.CView1和CView2从CWnd派生,还是要出错。

如果大家有时间,能亲自实践一下吗?先谢谢了,这个问题我翻便了网络,找到一个和我一样的问题,但最后还是没解决。。。

#9


你的窗口切分,好象没有对其进行初始化和重新布局。


我只说我的方法:

你建的应该是基于多文档的工程,工程里有一个已有的CView类(例你的工程是test,它就为CTestView),你新建一个CView 类(假如为CDrawView),那么你在CChildFrame类中的OnCreateClient事件里添加以下代码即可:
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
// TODO: Add your specialized code here and/or call the base class
CRect rect;
this->GetWindowRect(&rect);
BOOL bRes=m_wndSplitter.CreateStatic(this,1,2);
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTestView),CSize(0,0),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CDrawView),CSize(0,0),pContext);
m_wndSplitter.SetColumnInfo(0,rect.Width()/2,10);
m_wndSplitter.SetColumnInfo(1,rect.Width()/2,10);//对切分的窗体进行初始化
m_wndSplitter.RecalcLayout();//对窗体进行重新布局
//return CMDIChildWnd::OnCreateClient(lpcs, pContext);
return bRes;
}

#10


我新建的工程确实是建立的单文档程序,没有选择“文档/视图结构支持”。
工程名:test
工程中自动有的类:CAboutDlg、CChildView、CMainFrame、CtestApp。

照您所说,我这样写:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
CRect rect;
this->GetWindowRect(&rect);
BOOL bRes=m_wndSplitter.CreateStatic(this,1,2);
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CView1),CSize(0,0),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CView2),CSize(0,0),pContext);
m_wndSplitter.SetColumnInfo(0,rect.Width()/2,10);
m_wndSplitter.SetColumnInfo(1,rect.Width()/2,10);//对切分的窗体进行初始化
m_wndSplitter.RecalcLayout();//对窗体进行重新布局
//return CMDIChildWnd::OnCreateClient(lpcs, pContext);
return bRes;
}

还是要出错。
可是只要是在建立工程时的向导里选择了“文档/视图结构支持”,就一切正常了,可是我现在做的东西是没有“文档/视图结构支持”的,又需要拆分窗口,真是急死人呐!

#11


从你上面的话里,我看你建的是多文档工程,因为你的自动类中出现了CChildView类。

我是过了你的方法,的确通不过。编译通过,但程序运行不了,出现系统的内存错误。

我将上面的代码放到CChildFrame下,运行正常了。

#12


我有个疑问,你说没有“文档/视图结构支持”的支持,是说在工程前期的设定基类选的不是CView吗?

#13


我建立的确实是单文档应用程序呀(向导第一步我选择的是单文档),单文档程序里面也有CChildView。
另外,我重新建立了个多文档的,照您的说法,还是编译通过,运行时候内存错误!
还有,我说的没有“文档/视图结构支持”是指,在向导第一步的时候,有个“文档/视图结构支持”(英文版的为“Document/View architecture support”),它前面的复选框没有选中。这样,在生成的自动类里面就没有文档类了。

#14


哦,对,是我搞错了。

我也是刚学的,可能帮不了你。

但是我只要将上面的代码放在CMainFrame里,就会出错,可能主窗口是不能用于切分的。

帮不了你了

#15


你可以找书vc++6.0技术内幕,上面有一个例子,照做一遍就可以了

#16


麻烦大家了,《vc++6.0技术内幕》这本书我买了的,上面的例子也是基于“文档/视图结构支持”的,我就从来没看到过不用“文档/视图结构支持”拆分窗口的,哎,这个问题真麻烦呀!

#17


实在不行只有自己写个类通过WM_SIZE来模拟了。。。不过自己写好麻烦。。。还不一定好。。。

#18


只要有VIEW类就可以的

#19


up

#20


我做过 类似的 非文档/视图结构程序中拆分窗口

只是没有用它的cview 而已 用自己的view类 成功

不过 确实有很多问题  所以建议最好不要做非文档的
因为它涉及 mfc底层的东西,而且存在mfc 的一个bug

编程编 的越多 mfc的 bug你将发现的越多

#21


不要用mfc的文档视图机制,业务与显示耦合太重,太烂了,自己写一个拆分窗口的类就行了,

#22


不要文档和视图结构也是可以的.就是在对话框里你也可以分割窗口出来.你看看CODEPROJECT上关于分割条的例子.挺详细的.