Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MFC CListbox GetItemData失败_C++_Sorting_Mfc_Listbox - Fatal编程技术网

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
和no
LBS\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是相同的值。。。原来我是对的。。。。