C++ MFC CListbox GetItemData失败
我使用C++ MFC CListbox GetItemData失败,c++,sorting,mfc,listbox,C++,Sorting,Mfc,Listbox,我使用DrawItem()重新绘制了我的CListbox。出于某些原因,我想使用自定义比较来按照自己的规则对列表项进行排序,并使用LBS\u sort和noLBS\u hastring属性。在OnInitDialog()中使用SetItemData()后,我在DrawItem()中获得了这些数据,但它不起作用。代码如下所示: 初始代码: void OnInitDialog(...) { ......... m_List.SetListHeight (40); for
DrawItem()
重新绘制了我的CListbox
。出于某些原因,我想使用自定义比较来按照自己的规则对列表项进行排序,并使用LBS\u sort
和noLBS\u hastring
属性。在OnInitDialog()
中使用SetItemData()
后,我在DrawItem()
中获得了这些数据,但它不起作用。代码如下所示:
初始代码:
void OnInitDialog(...)
{
.........
m_List.SetListHeight (40);
for (int i = 0 ; i < 20 ; i ++) {
m_List.AddString ((const char *) i);
m_List.SetItemData (i,(100 + i));
}
....
}
int CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct)
{
ASSERT(lpCompareItemStruct->CtlType == ODT_LISTBOX);
int a = lpCompareItemStruct->itemData1;
int b = lpCompareItemStruct->itemData2;
return (a - b);
}
重新绘制代码:
DrawItem (lpDIS)
{
..................
CString str;
int i = (int) GetItemData (lpDIS->itemID); // the i is not what I expect.
str.Format ("%d", (int) i);
dc.DrawText (str,CRect (&lpDIS->rcItem), DT_CENTER | DT_VCENTER | DT_SINGLELINE);
...................
}
struct test {
int a,b,c,d;
};
init_code :
test *ptest = new test[20]; /* just a test ,we don't delete memory till application ends */
for (int i = 0 ; i < 20 ; i ++) {
ptest [i].a = i;
int index = m_List.AddString ((const char *) (ptest + i));
m_List.SetItemDataPtr (index,(void *) (100 + i));
}
compare code :
int ListEx::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct)
{
// TODO: Add your code to determine the sorting order of the specified items
// return -1 = item 1 sorts before item 2
// return 0 = item 1 and item 2 sort the same
// return 1 = item 1 sorts after item 2
// ASSERT(lpCompareItemStruct->CtlType == ODT_LISTBOX);
test *pa,*pb;
pa = (test *) lpCompareItemStruct->itemData1; // crashed here
pb = (test *) lpCompareItemStruct->itemData2;
// ASSERT (pa);
// ASSERT (pb);
return (pa->a - pb->a);
}
draw_item code :
CString str;
test *ptest = (test *) (lpDIS->itemData);
str.Format ("%d", (int) ptest->a);
dc.DrawText (str,CRect (&lpDIS->rcItem), DT_CENTER | DT_VCENTER | DT_SINGLELINE);
当我使用时
***index = m_List.addstring ((const char *) i) ;
m_List.setitemdata (index,(100 + i));***
它可以工作,但是如果我使用struct添加string,则索引不正确,代码如下所示:
DrawItem (lpDIS)
{
..................
CString str;
int i = (int) GetItemData (lpDIS->itemID); // the i is not what I expect.
str.Format ("%d", (int) i);
dc.DrawText (str,CRect (&lpDIS->rcItem), DT_CENTER | DT_VCENTER | DT_SINGLELINE);
...................
}
struct test {
int a,b,c,d;
};
init_code :
test *ptest = new test[20]; /* just a test ,we don't delete memory till application ends */
for (int i = 0 ; i < 20 ; i ++) {
ptest [i].a = i;
int index = m_List.AddString ((const char *) (ptest + i));
m_List.SetItemDataPtr (index,(void *) (100 + i));
}
compare code :
int ListEx::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct)
{
// TODO: Add your code to determine the sorting order of the specified items
// return -1 = item 1 sorts before item 2
// return 0 = item 1 and item 2 sort the same
// return 1 = item 1 sorts after item 2
// ASSERT(lpCompareItemStruct->CtlType == ODT_LISTBOX);
test *pa,*pb;
pa = (test *) lpCompareItemStruct->itemData1; // crashed here
pb = (test *) lpCompareItemStruct->itemData2;
// ASSERT (pa);
// ASSERT (pb);
return (pa->a - pb->a);
}
draw_item code :
CString str;
test *ptest = (test *) (lpDIS->itemData);
str.Format ("%d", (int) ptest->a);
dc.DrawText (str,CRect (&lpDIS->rcItem), DT_CENTER | DT_VCENTER | DT_SINGLELINE);
struct测试{
INTA、b、c、d;
};
初始代码:
测试*ptest=新测试[20];/*只是一个测试,在应用程序结束之前我们不会删除内存*/
对于(int i=0;i<20;i++){
ptest[i].a=i;
int index=m_List.AddString((常量字符*)(ptest+i));
m_List.SetItemDataPtr(索引,(void*)(100+i));
}
比较代码:
int ListEx::CompareItem(LPCOMPAREITEMSTRUCT LPCOMPAREITEMSTRUCT)
{
//TODO:添加代码以确定指定项目的排序顺序
//return-1=项目1排序在项目2之前
//返回0=项目1和项目2排序相同
//return 1=项目1排序在项目2之后
//断言(lpCompareItemStruct->CtlType==ODT\u列表框);
测试*pa,*pb;
pa=(test*)lpCompareItemStruct->itemData1;//在此处崩溃
pb=(测试*)lpCompareItemStruct->itemData2;
//断言(pa);
//断言(pb);
返回(pa->a-pb->a);
}
图纸项目代码:
CString-str;
测试*ptest=(测试*)(lpDIS->itemData);
str.格式(“%d”,(int)ptest->a);
dc.DrawText(str,CRect(&lpDIS->rcItem),DT|u中心| DT|u VCENTER | DT|u单线);
addstring是否只能使用字符串???
如果项目是结构数据,如何将这些结构数据设置为列表框项目??在OnInitDialog中,您应该执行以下操作:
for (int i = 0 ; i < 20 ; i ++) {
int index = m_List.AddString ((const char *) i);
m_List.SetItemData (index, 100 + i);
}
for(int i=0;i<20;i++){
int index=m_List.AddString((const char*)i);
m_List.SetItemData(索引,100+i);
}
AddString
返回插入项的索引(如果列表已排序,则索引可以位于任何位置)m_List.SetItemData(index,(100+i))
为刚插入的项目设置数据。我们可以将结构数据设置为列表框
struct _empInfo {
CString strName;
..............
} empInfo = {L"XYZ",...};
m_list.AddString(empinfo.strName);
我在我的应用程序中尝试了上述代码。这意味着我需要的不是I we getitemdata()。非常感谢,另一个问题是,当我使用addstring((const char*)I)时,它可以工作,但如果我使用结构来添加String,它将无法工作…@true\u casey:如果没有看到您的代码,很难说。该列表可能会丢失数据,因为如果有潜在的重新定位,未复制项目数据。我在Windows8.1平台上见过这种行为,为了解决它,我只做了两个连续的循环…我想我已经解决了它。。。LBS_SORT和no-LBS_hastring意味着SetItemData、SetItemDataPtr AddString是同一个东西,所以您可以只使用其中一个。。。。LBS_SORT和LBS_hastring意味着内部CListBox将分配一个额外的内存来存储字符串。。这就是它们之间的区别我猜检查这个链接我做了一个测试,代码是这样的(int I=0;I<20;I++){
int index=m_List.AddString((const char*)(I));
m_List.SetItemDataPtr(index,(void*)(10000+I));
CString str代码>inta=(int)GetItemDataPtr(索引)代码>intb=(int)lpDIS->itemData代码>str.Format(“a=%d,b=%d”,(int)a,(int)b)代码>lpDIS->itemData和getitemdata是相同的值。。。原来我是对的。。。。