【问题标题】:How can i attach userdata to each item in a listview? C++ Win32如何将用户数据附加到列表视图中的每个项目? C++ Win32
【发布时间】:2010-08-13 02:38:29
【问题描述】:

我在想我可以使用 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);

添加项目:

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);
    }
}

然后当我从 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);
    }

我做错了什么吗?列表视图创建得很好,并且项目添加了,但是我放入 LPARAM 值的指向我的类的指针似乎被忽略了,或者在我取消引用它时发生了变化

【问题讨论】:

    标签: c++ api winapi


    【解决方案1】:

    我以前没有在这个低级别工作过,但我怀疑您需要将 LVITEM 结构的掩码成员设置为 LVIF_PARAM(以及您需要的任何其他内容的适当值)才能调用 ListView_GetItem。

    【讨论】:

      【解决方案2】:

      您的代码在调试模式下运行良好,但在发布模式下却不行,因为 您错过了在 lvi.mask 中指定 LPARAM 的名称(以及您想要返回的任何其他字段的名称)。

      试试这个:

      lvi.iItem = ListView_GetNextItem(hlvQuiz, -1, LVNI_SELECTED);
      lvi.mask = LVIF_PARAM;
      
      if (ListView_GetItem(fm->hlvQuiz, &lvi) == TRUE) ...
      

      您将收到您设置的 LPARAM 值的副本。我认为这种奇怪的小行为是由于调试模式的帮助为您初始化了一切。而不是 Release 模式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多