Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将userdata附加到listview中的每个项?C++;Win32_C++_Api_Winapi - Fatal编程技术网

C++ 如何将userdata附加到listview中的每个项?C++;Win32

C++ 如何将userdata附加到listview中的每个项?C++;Win32,c++,api,winapi,C++,Api,Winapi,我在想我可以使用LVITEM结构LPARAM来附加一个指向我的类的指针,但我似乎无法让它工作 以下是我的代码的主要部分: 创建listview: hlvQuiz = CreateChild(WC_LISTVIEW, "", WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | LVS_ICON | LVS_AUTOARRANGE, 0, 0, 320, 240, m_hwnd, FontNormal); 添加项目: if (vQui

我在想我可以使用LVITEM结构LPARAM来附加一个指向我的类的指针,但我似乎无法让它工作

以下是我的代码的主要部分:

创建listview:

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

我做错什么了吗?listview创建得很好,项也添加了,但是我放在LPARAM值中的指向我的类的指针似乎被忽略了,或者在我去引用它时被更改了

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

您的代码在调试模式下工作正常,但在发布模式下工作不正常,因为 您没有在
lvi.mask
中指定LPARAM的名称(以及要返回的任何其他字段的名称)

试试这个:

lvi.iItem = ListView_GetNextItem(hlvQuiz, -1, LVNI_SELECTED);
lvi.mask = LVIF_PARAM;

if (ListView_GetItem(fm->hlvQuiz, &lvi) == TRUE) ...
您将收到一份您设置的LPRAM值的副本。我认为这种奇怪的行为是由于调试模式的帮助,它为您初始化了所有内容。而发布模式则没有

lvi.iItem = ListView_GetNextItem(hlvQuiz, -1, LVNI_SELECTED);
lvi.mask = LVIF_PARAM;

if (ListView_GetItem(fm->hlvQuiz, &lvi) == TRUE) ...