写了一个集成自CListCtrl的类,CListCtrl->CBaseList->CListBill在一个窗体中定义了这个类的成员变量 CListBill *m_plistBill
然后再InitialDialog()中构造:
CRect rect_nlist(10,300,700,650);
this->GetClientRect(&rect_nlist);
rect_nlist.top=140;
rect_nlist.left+=10;
rect_nlist.right-=10;
rect_nlist.bottom=300;
this->m_plistBill=new CListBill();
m_plistBill->Create(WS_CHILD|WS_VSCROLL  
|WS_VISIBLE|LVS_REPORT|WS_BORDER,
rect_nlist,this,ID_NEWLISTBILL); this->m_plistBill->ModifyStyle(LVS_EDITLABELS, 0L); //禁止标题编辑
m_plistBill->ModifyStyle(0L, LVS_REPORT); //设为Report类型
m_plistBill->ModifyStyle(0L, LVS_SHOWSELALWAYS); //始终高亮度被选中的表项
m_plistBill->ModifyStyle(0L, LVS_NOSORTHEADER); m_plistBill->ModifyStyle( LVS_OWNERDRAWFIXED,0L);
m_plistBill->SetExtendedStyle( LVS_EX_FULLROWSELECT | //允许整行选中
LVS_EX_GRIDLINES | //画出网格线
LVS_EX_FLATSB //扁平风格的滚动条
); m_plistBill->Create(WS_CHILD|WS_VSCROLL  
|WS_VISIBLE|LVS_REPORT|WS_BORDER,
rect_nlist,this,ID_NEWLISTBILL); 并且制定了 parent指针为当前窗体的this可是当在这个窗体出现模态对话框的时候 例如MessageBox() 或者 是 DoModal();时候发现出现了很多异常错误。
调试后发现: //m_plistBill 此时地址为 0x005925b0   
CDlgtest *dlg=new CDlgtest();
dlg->DoModal();
//m_plistBill  地址变成了0x00597c80
地址发生了偏移,而且在 dlg->DoModal(); 中没有其他产生消息的操作。会是什么原因啊!!!!! 我要挂了!!!! 困扰多天了,始终查不出原因来!

解决方案 »

  1.   

    从LZ的描述来看,是m_plistBill这个变量的低2字节内存被覆盖了,通常应该是使用对话框类中的其它成员时内存越结造成的,看一下对话框中是否定义了数组,注意数组的使用。
      

  2.   

    CDlgtest dlg;
    dlg->DoModal(); 
      

  3.   

    下内存断点看看是谁修改了数据。
    ba w4 0x005925b0
      

  4.   


    关键不是这个,所有MessageBox()的 前面和后面地址也会发生改变!搞不懂!!!! 怎么会这样,应该没有什么东西进行这块的操作啊,也没有数组
      

  5.   

    在显示模式对话框时,父窗口会收到很多消息,既然显示MessageBox也同样出问题,就说明问题与父窗口的消息响应有关,你可以这样来找问题:重载父窗口的WindowProc,先把m_plistBill的值储存在一个局部变量里面,然后响应消息,响应完后再判断m_plistBill的值是否与局部变量的值相同,如果不同则利用断点查看消息相关信息,然后重新启动程序,调试该消息的处理代码。