【发布时间】:2017-07-26 05:43:12
【问题描述】:
我有一个包含数千个字符串的向量:
std::vector<std::wstring> a;
充满了一些算法。
按照here 描述的方法,下面是我如何将ListView 创建为“虚拟列表”:
hList = CreateWindowEx(0, WC_LISTVIEW, L"", WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_OWNERDATA, 0, 0, 800, 400, hWnd, (HMENU)ID_LISTVIEW, hInst, NULL);
LV_COLUMN lvcol;
...
ListView_InsertColumn(hList, 0, &lvcol);
ListView_SetItemCountEx(hList, 100000, LVSICF_NOSCROLL);
...
// in the message loop
case WM_NOTIFY:
pdi = (NMLVDISPINFO*) lParam;
pi = pdi->item;
switch (pdi->hdr.code)
{
case LVN_GETDISPINFO:
{
pi.mask = LVIF_TEXT;
pi.pszText = a[pi.iItem]; // the nth item should be the nth string in the vector
}
}
我尝试了很多变化:
pi.pszText = a[pi.iItem];
但他们都因此类错误而失败:
错误 C2440:“=”:无法从“std::basic_string,std::allocator>”转换为“LPWSTR”
什么可以帮助做到这一点?
注意:实际上我想在ListView 的行n 上显示:向量a 的第n个 字符串与数字n 连接,就像这样@ 987654332@ 在第 217 行。
注意 2:即使在 Igor 的建议之后(即演员 pi.pszText = LPWSTR(a[pi.iItem].c_str());),ListView 仍然是空的,而不是显示元素。
【问题讨论】:
-
你正在构建一个 Unicode。控件需要 Unicode 字符串。你能用
std::vector<std::wstring>代替吗?然后你会写pi.pszText = a[pi.iItem].c_str(); -
啊。刚投:
pi.pszText = LPWSTR(a[pi.iItem].c_str()); -
什么是圆周率?看起来像一个局部变量。您需要返回通知消息中传递给您的结构中的字符串。
-
@Basj:根据documentation:“如果
LVITEM结构接收项目文本,则pszText和cchTextMax成员指定缓冲区的地址和大小。您可以将文本复制到缓冲区,也可以将字符串的地址分配给pszText成员。在后一种情况下,您不能更改或删除字符串,直到相应的项目文本被删除或已发送另外两条LVN_GETDISPINFO消息。"
标签: c++ listview winapi vector