win32 从列表视图中检索所有选定项目的索引

win32 retrieve index of all selected items from listview

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

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

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

您的迭代代码本质上是正确的。问题是您在第二次调用 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 的最后一个项目。

您不需要对 SendMessage 进行函数调用。像这样写for循环。

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

好吧,这在功能上与上面的示例相同。 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))