如何将userdata附加到列表视图中的每个项目?C++ Win32

Kai*_*ije 2 c++ api winapi

我以为我可以使用LVITEM结构LPARAM将指针附加到我的类,但我似乎无法让它工作!

这是我的代码的主要部分:

创建列表视图:

hlvQuiz = CreateChild(WC_LISTVIEW, "",
    WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | LVS_ICON | LVS_AUTOARRANGE,
    0, 0, 320, 240, m_hwnd, FontNormal);
Run Code Online (Sandbox Code Playgroud)

添加项目:

if (vQuizes.size() > 0)
{
    LVITEM lvi;
    lvi.mask = LVIF_TEXT | LVIF_PARAM;
    lvi.iItem = 0;
    lvi.iSubItem = 0;
    lvi.cchTextMax = QUIZSTRLEN;

    for (unsigned int i = 0; i < vQuizes.size(); i++)
    {
        lvi.lParam = (LPARAM)&vQuizes[i]; // adding pointer to lparam
        lvi.pszText = vQuizes[i].szName;
        ListView_InsertItem(hlvQuiz, &lvi);
    }
}
Run Code Online (Sandbox Code Playgroud)

后来当我从LPARAM回来上课时:

        LVITEM lvi;
    lvi.iItem = ListView_GetNextItem(hwnd, -1, LVNI_SELECTED);
    lvi.iSubItem = 0;

    if (ListView_GetItem(fm->hlvQuiz, &lvi) == TRUE)
    {
        Quiz* q = (Quiz*)lvi.lParam;
        if (q != NULL) // i get stopped here because my pointer is NULL
            if (Exists(q->szPath) == IS_FILE)
                ShellExecute(NULL, "edit", q->szPath, NULL, NULL, SW_SHOWNORMAL);
    }
Run Code Online (Sandbox Code Playgroud)

有什么我做错了吗?列表视图创建正常,并且项目添加,但是我放入LPARAM值的指向我的类的指针似乎被忽略,或者在我取消引用它时更改

The*_*ish 5

我以前没有在这个低级别工作,但我怀疑你需要将LVITEM结构的掩码成员设置为LVIF_PARAM(以及你需要的任何其他东西的适当值)来调用ListView_GetItem.

  • 是的,LVITEM.mask至关重要. (2认同)