首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MFC CListbox GetItemData失败

MFC CListbox GetItemData失败
EN

Stack Overflow用户
提问于 2015-06-03 11:56:57
回答 2查看 1.1K关注 0票数 0

我用DrawItem()重绘我的CListbox。出于某些原因,我希望使用自定义比较来按照自己的规则对列表项进行排序,并且使用LBS_SORT而不使用LBS_HASSTRING属性。在OnInitDialog()中使用了OnInitDialog()之后,我在DrawItem()中获得了这些数据,但是它没有工作。代码如下:

init代码

代码语言:javascript
复制
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));
    }
    ....
}

比较代码

代码语言:javascript
复制
int CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct) 
{       
    ASSERT(lpCompareItemStruct->CtlType == ODT_LISTBOX);

    int     a = lpCompareItemStruct->itemData1;
    int     b = lpCompareItemStruct->itemData2;

    return (a - b);
}

重绘代码:

代码语言:javascript
复制
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); 
        ...................
}

当我使用

代码语言:javascript
复制
        ***index = m_List.addstring ((const char *) i) ;
        m_List.setitemdata (index,(100 + i));***

它可以工作,但是如果我使用一个结构来添加字符串,索引是不正确的,代码如下所示:

代码语言:javascript
复制
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); 

是加载项只能使用字符串?如果该项是结构数据,如何将这些结构数据设置为列表框项?

EN

回答 2

Stack Overflow用户

发布于 2015-06-03 14:53:40

在OnInitDialog中,您应该这样做:

代码语言:javascript
复制
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))为您刚刚插入的项设置数据。

票数 0
EN

Stack Overflow用户

发布于 2015-06-05 00:44:06

我们可以将结构数据设置为列表框。

代码语言:javascript
复制
struct _empInfo {
    CString strName;
    ..............
} empInfo = {L"XYZ",...};

m_list.AddString(empinfo.strName);

我在我的应用程序中尝试了上面的代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30619459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档