我在看一个程序上面的class MyListCtrl : public CListCtrl自定义了个结构ITEMDATA然后由GetItemData(i)返回这个结构指针我想知道是怎么获得正确的值得呢?我看列表的项并不与自定义结构ITEMDATA一一对应,有些糊涂了。

解决方案 »

  1.   

    GetItemData返回的是一个结构的指针,所以什么结构你就强制转换好了,GetItemData取决于你SetItemData设置的指针!
      

  2.   

    //添加一个项目。
    int nItem = MyListCtrl.InsertItem(MyListCtrl.GetItemCount(), _T("Test"));//创建自定义结构。(不能使用局部变量)
    ITEMDATA *pData = new ITEMDATA; //设置项目数据。
    MyListCtrl.SetItemData(nItem, (DWORD)pData);//获取项目数据。
    ITEMDATA *pData = (ITEMDATA *)MyListCtrl.GetItemData(nItem);
    //删除MyListCtrl中的项目前要先 delete (ITEMDATA *)MyListCtrl.GetItemData(nItem);
      

  3.   

     你看它怎么SetItemData,你GetItemData得的就是那个东东.类型不对就强制转换好了,一般存的都是指针或者索引. 只要item有对应的一个结构就行了,没必要一一对应。
      

  4.   

    要在添加Item时通过lParam参数设置指针,或者在添加Item之后用SetItemData设置指针。
      

  5.   

    一般获取数据有两种情况:
    1.单击某一项,这个只需要处理单击事件即可。如:
    void CXXXDialog::OnItemSelect(NMHDR* pNMHDR, LRESULT* pResult)
    {
    UpdateData(TRUE);
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    ITEMDATA *pdata; pdata=(ITEMDATA *)m_myListctrl.GetItemData(pNMListView->iItem);//这个是对应的点击的那一项
    if(msg)
    { }
    *pResult = 0;
    }
    2.用户选择了多个条目,依次想获得各个数据,应该如下处理。
    POSITION pos = m_myListctrl.GetFirstSelectedItemPosition();
    ITEMDATA *pData;
    while (pos)
    {
    int nItem = m_myListctrl.GetNextSelectedItem(pos);
    pData = (ITEMDATA*)m_myListctrl.GetItemData(nItem);//获得这次选中的项的数据
    if(pData != NULL)
                    {
                        //处理你的数据
                       }
    }
      

  6.   


    GetItemDataSetItemData保存的是一个 32位 的数,这个数可以是:
    1、一个整数,直接使用;2、一个整数,不过把它认为是一个指针,指向另一个地方。同是一个整数,就看怎么理解它了。
      

  7.   


    地址编码      内容
    ========    =====
    A0000001    E2
    A0000002    F8
    A0000003    02
    A0000004    1C假如 SetItemData 中存储了 A0000001 的话,有两种理解方式:1、存储的是一个整数,那就是 十六进制的 A0000001,十进制为 26843545612、存储的是作为指针,而且是一个整数指针,那结果就是 十六进制的 E2F8021C,十进制为 3807904284
    举个例子,可能有错误,但是这个理。
      

  8.   

    问题是,我搜索了下,程序中没有使用到SetItemData不过列表项删除正如2楼所言自定义的结构甚至有列表项没有的项
      

  9.   

    //可以在添加项目时设置数据。
    LVITEM lvi;
    lvi.mask = LVIF_TEXT | LVIF_PARAM;
    lvi.cchTextMax = _tcsLen(szName) + 1;
    lvi.pszText = szName;
    lvi.iItem = MyListCtrl.GetItemCount();
    lvi.iSubItem = 0;
    lvi.lParam = (LPARAM)pData; //ITEMDATA *。MyListCtrl.InsertItem(&lvi);
      

  10.   

    现在有些明白了我找了找列表插入数据的地方,看见
    ITEMDATA *pItem(函数参数)LV_ITEM lvi;lvi.lParam=(LPARAM)pItem;InsertItem(&lvi)param并不在列表项各列显示但是在GetItemData的时候可以获取貌似是这样的效果似乎很有用的样子
      

  11.   

    前面不是跟你说了,可以在添加Item的时候设置,也可以添加之后再用SetItemData来设置。