我用DrawItem()重绘我的CListbox。出于某些原因,我希望使用自定义比较来按照自己的规则对列表项进行排序,并且使用LBS_SORT而不使用LBS_HASSTRING属性。在OnInitDialog()中使用了OnInitDialog()之后,我在DrawItem()中获得了这些数据,但是它没有工作。代码如下:
init代码:
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);
...................
}当我使用时
***index = m_List.addstring ((const char *) i) ;
m_List.setitemdata (index,(100 + i));***它可以工作,但是如果我使用一个结构来添加字符串,索引是不正确的,代码如下所示:
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); 是加载项只能使用字符串?如果该项是结构数据,如何将这些结构数据设置为列表框项?。
发布于 2015-06-03 14:53:40
在OnInitDialog中,您应该这样做:
for (int i = 0 ; i < 20 ; i ++) {
int index = m_List.AddString ((const char *) i);
m_List.SetItemData (index, 100 + i);
}AddString返回已插入项的索引(如果对列表进行排序,该索引可以在任何位置)。m_List.SetItemData (index ,(100 + i))为您刚刚插入的项设置数据。
发布于 2015-06-05 00:44:06
我们可以将结构数据设置为列表框。
struct _empInfo {
CString strName;
..............
} empInfo = {L"XYZ",...};
m_list.AddString(empinfo.strName);我在我的应用程序中尝试了上面的代码。
https://stackoverflow.com/questions/30619459
复制相似问题