我要实现一功能,当我点某个项时,会变大。基本已经OK了,却发现了一个问题,只有在特定情况下产生。
这个情况是这样的:比如说我有四个项,列表框刚好容的下,但因为我的功能是点击后会变大,列表框就会自动产生滚动条,之后就会有问题,DrawItem的lpDrawItemStruct->itemData这个数据不能用,一用就内存错误,就点击第0项的时候会内存错误,点击其它项没事。
代码在下面,请指点一二,谢谢。
void CIWRListBox::OnLbnSelchange()
{
// TODO: 在此添加控件通知处理程序代码
SetSelect();
}void CIWRListBox::SetSelect()
{
m_bRealDelete=FALSE;
int iIndex;
iIndex=GetCurSel();
if (m_iLastSelect==iIndex) return;
if (m_iLastSelect!=-1)
{
UpdateItemState(m_iLastSelect,FALSE); }
UpdateItemState(iIndex,TRUE);
SetCurSel(iIndex);
m_bSetSelect=false;
m_iLastSelect=iIndex;
m_bRealDelete=TRUE;
return;
}void CIWRListBox::UpdateItemState(int iIndex,BOOL bSelect)
{
m_bSetSelect=bSelect;
DWORD_PTR dp=GetItemData(iIndex);
DeleteString(iIndex);
InsertString(iIndex,_T(""));
SetItemData(iIndex,dp);
return;
}
void CIWRListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{ // TODO: 添加您的代码以绘制指定项
CIWRListBox::DrawItem(lpDrawItemStruct);
CDC dc;
int iSaveDC;
dc.Attach(lpDrawItemStruct->hDC);
iSaveDC=dc.SaveDC();
dc.SetTextColor(colListBoxName);
dc.SetBkMode(TRANSPARENT);
CRect rt;
rt=lpDrawItemStruct->rcItem;
CString* s=(CString*)lpDrawItemStruct->itemData;
CString ss;
dc.DrawText(*s,rt,DT_CENTER|DT_SINGLELINE|DT_VCENTER);
dc.RestoreDC(iSaveDC);
dc.Detach();
}
void CIWRLBTest::DeleteItem(LPDELETEITEMSTRUCT lpDeleteItemStruct)
{
// TODO: 在此添加专用代码和/或调用基类
if (!m_bRealDelete)
{
return;
}
TRACE(_T("REAL:%d\r\n"),lpDeleteItemStruct->itemID);
delete (CString*)(lpDeleteItemStruct->itemData);
CIWRListBox::DeleteItem(lpDeleteItemStruct);
}
这个情况是这样的:比如说我有四个项,列表框刚好容的下,但因为我的功能是点击后会变大,列表框就会自动产生滚动条,之后就会有问题,DrawItem的lpDrawItemStruct->itemData这个数据不能用,一用就内存错误,就点击第0项的时候会内存错误,点击其它项没事。
代码在下面,请指点一二,谢谢。
void CIWRListBox::OnLbnSelchange()
{
// TODO: 在此添加控件通知处理程序代码
SetSelect();
}void CIWRListBox::SetSelect()
{
m_bRealDelete=FALSE;
int iIndex;
iIndex=GetCurSel();
if (m_iLastSelect==iIndex) return;
if (m_iLastSelect!=-1)
{
UpdateItemState(m_iLastSelect,FALSE); }
UpdateItemState(iIndex,TRUE);
SetCurSel(iIndex);
m_bSetSelect=false;
m_iLastSelect=iIndex;
m_bRealDelete=TRUE;
return;
}void CIWRListBox::UpdateItemState(int iIndex,BOOL bSelect)
{
m_bSetSelect=bSelect;
DWORD_PTR dp=GetItemData(iIndex);
DeleteString(iIndex);
InsertString(iIndex,_T(""));
SetItemData(iIndex,dp);
return;
}
void CIWRListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{ // TODO: 添加您的代码以绘制指定项
CIWRListBox::DrawItem(lpDrawItemStruct);
CDC dc;
int iSaveDC;
dc.Attach(lpDrawItemStruct->hDC);
iSaveDC=dc.SaveDC();
dc.SetTextColor(colListBoxName);
dc.SetBkMode(TRANSPARENT);
CRect rt;
rt=lpDrawItemStruct->rcItem;
CString* s=(CString*)lpDrawItemStruct->itemData;
CString ss;
dc.DrawText(*s,rt,DT_CENTER|DT_SINGLELINE|DT_VCENTER);
dc.RestoreDC(iSaveDC);
dc.Detach();
}
void CIWRLBTest::DeleteItem(LPDELETEITEMSTRUCT lpDeleteItemStruct)
{
// TODO: 在此添加专用代码和/或调用基类
if (!m_bRealDelete)
{
return;
}
TRACE(_T("REAL:%d\r\n"),lpDeleteItemStruct->itemID);
delete (CString*)(lpDeleteItemStruct->itemData);
CIWRListBox::DeleteItem(lpDeleteItemStruct);
}
解决方案 »
- udp包大于1500字节网络传输会分包吗?udp tcp多大的包比较合适?
- 获取含全角字符的字符串长度
- MFC资源文件中Dialog的定义顺序对编码的关系
- 为什么我的鼠标钩子不能得到鼠标双击的消息
- 如何使工具栏中的按钮变灰呀?不希望通过ON_Update_Command_UI之类的方法.
- vc可不可以协同编程,怎么设置呢??
- 我太孤独!有 eVC3.0 的同行伙伴吗?
- ActiveX控件调用ActiveX控件
- 在MFC框架下如何在DataGird显示的表格中添加Check Box按钮?
- 串口通信,在一台电脑上可以测试通过,但是在两台电脑上却无法接收到数据
- DEL键删除
- 【求助】关于语音识别的一个小问题!
想个替代的方案
如果在这种情况下点击0行不去访问lpDrawItemStruct->itemData呢?
dc.DrawText(s,rt,DT_CENTER|DT_SINGLELINE|DT_VCENTER);
dc.RestoreDC(iSaveDC);
dc.Detach();
作为指针来访问,的首选保证其有效性,否则容易产生非法访问错误
CString ss;
dc.DrawText(*s,rt,DT_CENTER|DT_SINGLELINE|DT_VCENTER); 没这样用过,会不会是这里的问题,这样改行不行呢LPCTSTR s = (LPCTSTR)(lpDrawItemStruct->itemData);
dc.DrawText(s,-1,DT_CENTER|DT_SINGLELINE|DT_VCENTER);
for (int i=0;i<10;i++)
{
CString* cs=new CString();
cs->Format(_T("test:%d"),i);
m_lbFriend.AddString(_T(""));
m_lbFriend.SetItemData(i,(DWORD_PTR)cs);
}这是在对话框初始化的时候向listbox添加项目的代码。然后在drawitem的时候把这个指针拿出来。
像这样有问题吗?
但是不明白,cstring无非是一个类而已。为什么其他的可以,cstring就不可以?
我现在就是想把这个cstring传进去,没有办法吗?