在LVM_GETITEM上使用LVITEM结构的缓冲区或pszText成员

时间:2015-08-02 10:26:57

标签: c++ listview winapi

如果我想从列表视图中的某个项目和子项目中读取值,请执行以下操作:

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消息之后)。

0 个答案:

没有答案