现小弟急做一窗口拆分...
需将现在已经做好的继承自CWnd的窗口填充进去,但程序里无DOC/VIEW...我在splitterwnd.CreateView时,应该怎么关联到此CWnd继承类的窗口... 手动再加上doc/view吗?急问

解决方案 »

  1.   

    应该可以的吧,在类定义里有DECLARE_DYNAMIC也就是支持runtimeclass的可能就可以,试一下就知道了。
      

  2.   

    不行的,测试过了,在运行时会检测你CreateView传进去的指针是不是CView*ASSERT_KINDOF(CView, pViewNew);那就还剩下两个方案:
    1: 手动将view/doc再加到程序中 (具体怎么弄咧?)
    2: 换种方式,不用splitter了, 能直接像动态创建一些控件那样,创建一些控件在不同的矩形区域...也就是自己绘制那横竖的移动条,然后自己响应拖动消息,将控件尺寸进行重绘...请大家多提供思路及方法....急...只要能解决问题,分不是问题...
      

  3.   

    用第一种方法时, 那个窗口是自己绘制的,怎么建立相关联的view咧?先测试第二种方法...
      

  4.   

    看看这个在对话框上的Splitter:
    http://www.codeproject.com/splitter/simpledlgsplitter.asp演示如何将CWnd派生类放入Pane(第二个Pane):
    http://support.microsoft.com/kb/q151032/
      

  5.   

    你的窗口干嘛直接继承CWnd呢,你继承CView不就行了,反正CView也是继承CWnd的,View里面不需要Doc,那东西是个鸡肋,不是更好。
      

  6.   

       首先你可以先定义好几个类,这几个类是将来的分割窗口所关联的类。在CMainFrame内添加CreateClient虚函数,在这里进行分割窗口。你分割的时候为每一个Pane指定一个类就行了。
      

  7.   

    先谢过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)"线程状态相关的错误,指示的无效地址...异常是时不时的出现,但大都报的异常都很奇怪...明明运行的很正常的代码,在我一点出这个拆分窗口时就出错...
    与我创建方式有关...我怀疑的是与线程状态有关系,但我代码并没有主动创建与这方面相关的线程啊,无非就是那四个视图窗口牵连了很多的窗口类...与这有关系...各位大哥给点意见...不尽感谢,分不是问题...
      

  8.   

    帐号:gofqjyie
    昵称:誓将天下了然于胸 这大哥认识小弟我...?
      

  9.   

    你说的异常似乎和拆分窗口无关,而是和线程有关,有个严格的限制必须记牢:CWnd及其派生类不得跨线程使用
      

  10.   

    不要在原因不明的情况下找解决方法,因为你的解决方法在这种情况下往往是错误的。即使让你用CWnd做子窗口,你就不遇到问题了?当然,拆分窗口应该有办法规避那个ISKINDOF宏的问题的,就看它在哪做这种检查即可
      

  11.   

    有个严格的限制必须记牢: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的所以现在找不着问题所在,很烦恼...
      

  12.   

    你这个问题估计是移植过来产生的问题,最好的方法就是重写代码,看别人代码很累,不如自己重写。一窗口拆分无非是PANE
    中加几个View,在C*APP中进行文档管理模板动态创建对象。
      

  13.   

    你可以在www.codeproject.com上找找,那里好像有,曾经看到过.
      

  14.   

    已经重做了,拆分窗口还是那样自己控制绘制...主要是Jarrylogin 说的那样,是移植代码的问题...自己写的代码,可控性高很多...好多异常都是因为数组越界,空指针,野指针造成的...好多都是些垃圾代码... 一般的delete指针不判断也就算了,delete后不置NULL,也算了,有地方就直接char szName[3];然后strcpy 两个字节进去,然后就到处使用szName...呵,现在还是有些异常没能看出所以然来...报的也就几个固定地方的异常了..
    谢谢各位的捧场,结帖...