(急问,200分)CSplitterWnd 可以直接用CWnd填充吗? CSplitterWnd是不是非要用在Doc/View下?

Stefine 2007-09-30 03:08:52
现小弟急做一窗口拆分...
需将现在已经做好的继承自CWnd的窗口填充进去,但程序里无DOC/VIEW...

我在splitterwnd.CreateView时,应该怎么关联到此CWnd继承类的窗口... 手动再加上doc/view吗?

急问

...全文
245 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Stefine 2007-10-08
  • 打赏
  • 举报
回复
已经重做了,拆分窗口还是那样自己控制绘制...

主要是Jarrylogin 说的那样,是移植代码的问题...

自己写的代码,可控性高很多...

好多异常都是因为数组越界,空指针,野指针造成的...好多都是些垃圾代码...

一般的delete指针不判断也就算了,delete后不置NULL,也算了,有地方就直接char szName[3];然后strcpy 两个字节进去,然后就到处使用szName...

呵,现在还是有些异常没能看出所以然来...报的也就几个固定地方的异常了..


谢谢各位的捧场,结帖...
Juchiyufei 2007-10-07
  • 打赏
  • 举报
回复
你可以在www.codeproject.com上找找,那里好像有,曾经看到过.
Stefine 2007-10-07
  • 打赏
  • 举报
回复
也正怀疑这点...
嗯,正打算重写...
Jarrylogin 2007-10-06
  • 打赏
  • 举报
回复
你这个问题估计是移植过来产生的问题,最好的方法就是重写代码,看别人代码很累,不如自己重写。一窗口拆分无非是PANE
中加几个View,在C*APP中进行文档管理模板动态创建对象。
Stefine 2007-10-06
  • 打赏
  • 举报
回复
没人了?

Stefine 2007-10-06
  • 打赏
  • 举报
回复
先UP,这问题困扰了我整个国庆...

过下打算重新考虑...

有朋友有什么好的建议,谢谢...
Stefine 2007-10-06
  • 打赏
  • 举报
回复
有个严格的限制必须记牢:CWnd及其派生类不得跨线程使用

这个我也明白,也仔细检查了,没有...(不过有时跨时也可detach 再attch,不过我代码里没有这应用)

不要在原因不明的情况下找解决方法,因为你的解决方法在这种情况下往往是错误的。

arong1234这句话很对...

我是一直没发现问题的根源...仅从几个报异常的调用堆栈里看不出什么来,而且大多的堆栈都指示为 CStringData::Release时的指标变成了无效地址...

再仔细描述下现况:
现在就是用的让四个CWnd作为四个子窗口,集成到一个CWnd里,然后再将此实现了拆分的CWnd在一MDI子窗口中创建...然后菜单调用创建此MDI子窗口...

问题:
异常:
报些很奇怪的异常:

msvcr71d.dll!_CrtIsValidHeapPointer(const void * pUserData=0x01eecf28) 行1807 C
msvcr71d.dll!_free_dbg_lk(void * pUserData=0x01eecf28, int nBlockUse=1) 行1132 + 0x9 C
msvcr71d.dll!_free_dbg(void * pUserData=0x01eecf28, int nBlockUse=1) 行1070 + 0xd C
msvcr71d.dll!free(void * pUserData=0x01eecf28) 行1025 + 0xb C
mfc71d.dll!CAfxStringMgr::Free(ATL::CStringData * pData=0x01eecf28) 行154 + 0xa C++
mfc71d.dll!ATL::CStringData::Release() 行99 C++
mfc71d.dll!ATL::CSimpleStringT<char,1>::operator=(const ATL::CSimpleStringT<char,0> & strSrc={...}) 行286 C++
mfc71d.dll!ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char> > >::operator=() 行970 C++
> HHJstock.exe!CStockBlock::GetBlockStock(const char * lpszBlock=0x01f24870, CStringList & strlStock={...}) 行170 + 0x43 C++

指示的代码行:
int nLen = strLoad.GetLength()/8;
string *pStock = new string[nLen];
int i = 0;
while(!strLoad.IsEmpty())
{
if(strLoad.GetLength()>=8)
{
CString strStock = strLoad.Left(8);
pStock[i++]=string((LPCTSTR)strStock);
strLoad=strLoad.Mid(8); //异常指向这里
}
else
strLoad="";
}

大多异常都是与CString释放相关...

并没有跨线程,只是窗口之间消息传递而已,转换成char*时,也先GetBuffer后再ReleaseBuffer的

所以现在找不着问题所在,很烦恼...
arong1234 2007-10-04
  • 打赏
  • 举报
回复
你说的异常似乎和拆分窗口无关,而是和线程有关,有个严格的限制必须记牢:CWnd及其派生类不得跨线程使用
Stefine 2007-10-04
  • 打赏
  • 举报
回复
帐号:gofqjyie
昵称:誓将天下了然于胸

这大哥认识小弟我...?
Stefine 2007-10-04
  • 打赏
  • 举报
回复
先谢过LS的几位...

这几天一直在加班,忘记来看了...

用splitter,还要改原来已封装好的,所以直接create四个view视图出来...然后onsize处理下,再OnMouseMove处理下移动自绘的分隔栏,也算达到那效果...

拆分的算是早就完成了,但留下来的问题,让我这两天来都摸不着头脑...

现在是这样的,大致描述下现状...
我在创建一个MDI子窗口时,去创建一个CBlockLine,而在CBlockLine中创建了四个view窗口,(也就是说cblockline实现拆分工作)
这里面创建的四个view窗口都是由CWnd继承下来的,而这个也正是主要的绘图窗口,其里面牵连了很多相关的类...
现在的问题是,异常时不时出现...

大约常见的几个异常如下:
vector<string> vtStock;
while(!strLoad.IsEmpty())
{
if(strLoad.GetLength()>=8) //strLoad是如SH600000SZ000559这样的
{
CString strStock = strLoad.Left(8);
vtStock.push_back(string((LPCTSTR)strStock));//异常出现在push_back后,最终显示是在cstringdata::release里,也就是应该在释放strStock时出错了...??????? 为什么咧,
strLoad=strLoad.Mid(8);
}
else
strLoad="";
}
而有时出来的异常也都与push_back相关...

还有时报"CThreadSlotData::GetThreadValue(int nSlot = 0)"线程状态相关的错误,指示的无效地址...

异常是时不时的出现,但大都报的异常都很奇怪...明明运行的很正常的代码,在我一点出这个拆分窗口时就出错...
与我创建方式有关...我怀疑的是与线程状态有关系,但我代码并没有主动创建与这方面相关的线程啊,无非就是那四个视图窗口牵连了很多的窗口类...与这有关系...

各位大哥给点意见...不尽感谢,分不是问题...
arong1234 2007-10-04
  • 打赏
  • 举报
回复
不要在原因不明的情况下找解决方法,因为你的解决方法在这种情况下往往是错误的。即使让你用CWnd做子窗口,你就不遇到问题了?

当然,拆分窗口应该有办法规避那个ISKINDOF宏的问题的,就看它在哪做这种检查即可
iyranly 2007-10-01
  • 打赏
  • 举报
回复
首先你可以先定义好几个类,这几个类是将来的分割窗口所关联的类。在CMainFrame内添加CreateClient虚函数,在这里进行分割窗口。你分割的时候为每一个Pane指定一个类就行了。
长尾巴的悟空 2007-10-01
  • 打赏
  • 举报
回复
好久没看着你了
showyfish 2007-10-01
  • 打赏
  • 举报
回复
你的窗口干嘛直接继承CWnd呢,你继承CView不就行了,反正CView也是继承CWnd的,View里面不需要Doc,那东西是个鸡肋,不是更好。
dyw 2007-09-30
  • 打赏
  • 举报
回复
看看这个在对话框上的Splitter:
http://www.codeproject.com/splitter/simpledlgsplitter.asp

演示如何将CWnd派生类放入Pane(第二个Pane):
http://support.microsoft.com/kb/q151032/
Stefine 2007-09-30
  • 打赏
  • 举报
回复
用第一种方法时, 那个窗口是自己绘制的,怎么建立相关联的view咧?

先测试第二种方法...
Stefine 2007-09-30
  • 打赏
  • 举报
回复
不行的,测试过了,

在运行时会检测你CreateView传进去的指针是不是CView*

ASSERT_KINDOF(CView, pViewNew);

那就还剩下两个方案:
1: 手动将view/doc再加到程序中 (具体怎么弄咧?)
2: 换种方式,不用splitter了, 能直接像动态创建一些控件那样,创建一些控件在不同的矩形区域...也就是自己绘制那横竖的移动条,然后自己响应拖动消息,将控件尺寸进行重绘...

请大家多提供思路及方法....急...只要能解决问题,分不是问题...
guo_wei 2007-09-30
  • 打赏
  • 举报
回复
应该可以的吧,在类定义里有DECLARE_DYNAMIC也就是支持runtimeclass的可能就可以,试一下就知道了。

15,978

社区成员

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

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