ListView_GetNextItem 始终返回 0

yet*_*der 0 c++ winapi

我有一些代码当前导致无限循环,但我无法找到原因。

该代码旨在根据列表框中选择的项目在整数上设置位标志。这是由 While 循环中的 case 语句处理的。

我已经在调试器上跟踪了代码,并且 selectedItem 的值永远不会改变。列表框的句柄似乎有效,并且使用相同的句柄进行填充。

我尝试过使用 SendMessage 函数和 ListView_GetNextItem 宏,前者在我的代码中被注释掉。

任何帮助将不胜感激,我假设我在这里遗漏了一些明显的东西!

编辑:我将此循环基于此处看到的循环: win32retrieve index of all selected items from listview

int getTypeStatus()
{
    int retVal =0;
    //int selectedItem = SendMessage(lstFileStatus, LVM_GETNEXTITEM, (WPARAM)-1, MAKELPARAM(LVIS_SELECTED,0));
    int selectedItem = ListView_GetNextItem(lstFileStatus,-1, LVNI_SELECTED);
    while (selectedItem != -1)
    {
        switch (selectedItem){
        case 0:
            retVal = retVal | NOT_VERIFIED;
            break;
        case 1:
            retVal = retVal | IRRELEVANT;
            break;
        case 2:
            retVal = retVal | NOT_IN_LIST;
            break;
        case 3:
            retVal = retVal | CONFIRMED;
            break;
        case 4:
            retVal = retVal | NOT_CONFIRMED;
            break;
        case 5:
            retVal = retVal | NEWLY_IDENTIFIED;
            break;
        case 6:
            retVal = retVal | MISMATCH_DETECTED;
            break;
        }
        selectedItem = ListView_GetNextItem(lstFileStatus,selectedItem, LVNI_SELECTED);
    }
    return retVal;
}
Run Code Online (Sandbox Code Playgroud)

编辑:还包括用于创建控件和填充的代码(有效)

lstFileStatus = CreateWindowEx(0,"ListBox","",WS_CHILD|WS_VISIBLE|LBS_NOTIFY|WS_BORDER|LBS_EXTENDEDSEL,LeftHandStartX,TypeLineY,130,170,hwnd,(HMENU)IDC_LBX_TYPESTATUS,GetModuleHandle(NULL),0);
if (!lstFileStatus) {outputControlOutputError("lstFileStatus");}
for (int i=0;i<numTypeStatus;i++)
{
    SendMessage(lstFileStatus,LB_ADDSTRING,0,(LPARAM)arrayTypeStatus[i]);
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*ter 5

LVM_GETNEXTITEM是一个列表视图控件消息,但您的控件是一个列表框。它们是不同的控件,并且消息不可互换。

要从多选列表框中获取所选项目,您需要使用来LB_GETSELCOUNT获取选择的数量,分配一个该大小的整数数组,然后使用LB_GETSELITEMS来获取选择索引。