如果我想从列表视图中的某个项目和子项目中读取值,请执行以下操作:
const int MAX_SIZE = 256;
char szBuffer[MAX_SIZE];
LVITEM lvItem = {0};
lvItem.iItem = rowIndex;
lvItem.iSubItem = subItemIndex;
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
lvItem.cchTextMax = MAX_SIZE;
lvItem.pszText = szBuffer;
// Get item
SendMessage(hListView, LVM_GETITEM, 0, (LPARAM)&lvItem);
// Print value, which one always guaranteed to work?
std::cout << lvItem.pszText << std::endl;
std::cout << lvItem.szBuffer << std::endl;
现在,阅读MSDN Documentation on LVM_GETITEM我们看到它说
应用程序不应假设文本必须放在指定的缓冲区中。控件可以改为将结构的pszText成员更改为指向新文本,而不是将其放在缓冲区中。
我们如何知道何时使用缓冲区(本例中为szBuffer)而不是使用
是安全的lvItem.pszText
直接?
也许我们总是要做(或类似):
if(lvItem.pszText != szBuffer)
snprintf(szBuffer, MAX_SIZE, "%s", lvItem.pszText);
将LVITEM结构的pszText中的值复制到 我们的缓冲区(当然我们发送了LVM_GETITEM消息之后)。