我在想我可以使用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值的我的类的指针似乎被忽略,或者在我解除引用时更改
答案 0 :(得分:5)
之前我没有在这个低级别工作,但我怀疑你需要将LVITEM结构的掩码成员设置为LVIF_PARAM(以及你需要的任何其他东西的适当值)来调用ListView_GetItem。 / p>
答案 1 :(得分:0)
您的代码在调试模式下工作正常但在发布模式下没有,因为
您错过了在lvi.mask
中指定LPARAM的名称(以及您想要返回的任何其他字段的名称)。
试试这个:
lvi.iItem = ListView_GetNextItem(hlvQuiz, -1, LVNI_SELECTED);
lvi.mask = LVIF_PARAM;
if (ListView_GetItem(fm->hlvQuiz, &lvi) == TRUE) ...
您将收到已设置的LPARAM值的副本。我认为这个小奇怪的行为是由于Debug模式的帮助,为您提供了所有内容。而发布模式却没有。