win32从listview中检索所有选定项目的索引

时间:2015-03-17 07:23:32

标签: c winapi

有谁知道如何解决这个问题 我想为列表中的每个选定项目执行代码

            itemint=SendMessage(hwndList,LVM_GETNEXTITEM,-1,LVNI_SELECTED))
              {
                while (itemint != -1)
                  {
                    itemint =SendMessage(hwndList,LVM_GETNEXTITEM, itemint, LVNI_SELECTED);
                      //// 
                  }

无法从所选项目中找到第一个(具有最低索引)项目

3 个答案:

答案 0 :(得分:4)

您的迭代代码本质上是正确的。问题是您在第二次调用SendMessage后正在开展工作,这可以通过评论行的位置来证明。将工作移至第二次调用SendMessage之前,您不会跳过第一个选定的项目。

itemint = SendMessage(hwndList, LVM_GETNEXTITEM, -1, LVNI_SELECTED))
{
    while (itemint != -1)
    {
        // do work on selected item here
        itemint = SendMessage(hwndList, LVM_GETNEXTITEM, itemint, LVNI_SELECTED); 
    }
}

对于它的价值,您的代码将错过第一个选定的项目,但也会向您显示索引为-1的最终项目。

答案 1 :(得分:1)

您无需调用SendMessage。像这样写循环。

for (itemInt = -1; (itemInt = SendMessage(hwndList, LVM_GETNEXTITEM, itemInt , LVNI_SELECTED)) != -1; )
{
   // do work on selected item here
   DoIt(itemInt);
}

答案 2 :(得分:0)

嗯,这在功能上与上面的例子相同。 ListView_GetNextItem只是一个方便的宏,它转换为SendMessage LVM_GETNEXTITEM。我喜欢这个可读性。

int itemint=-1;
while((itemint=ListView_GetNextItem(hwndList,itemint,LVNI_SELECTED))!=-1)
{
  ...
}

您将在CommCtrl.h中看到它的定义如下:

#define ListView_GetNextItem(hwnd, i, flags) \
    (int)SNDMSG((hwnd), LVM_GETNEXTITEM, (WPARAM)(int)(i), MAKELPARAM((flags), 0))