我有一个包含数千个字符串的向量:
std::vector<std::wstring> a;
充满了一些算法。
按照here所述的方法,以下是我如何创建ListView
作为&#34;虚拟列表&#34;:
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:&#39; =&#39; :无法转换为&#39; std :: basic_string,std :: allocator&gt;&#39;到了LPWSTR&#39;
有什么办法可以做到这一点?
注意:实际上我想在n
的行ListView
上显示:与数字a
连接的向量n
的n th 字符串{1}},与第217行的Blabla217
一样。
注2:即使在Igor的建议(即演员pi.pszText = LPWSTR(a[pi.iItem].c_str());
)之后,ListView仍然是空的,而不是显示元素。
答案 0 :(得分:0)
我不确定您面临的问题,但有一点可以肯定,您使用std::string
传递多字节字符串char
)当它要求宽字符串(std::wstring
时,使用WCHAR
)。
以下是一个便捷的代码,可将std::string
转换为std::wstring
。
inline std::wstring WideFromMulti(
std::string const & multi,
UINT codepage)
{
int cchWide = MultiByteToWideChar(codepage, 0, multi.c_str(), -1, nullptr, 0);
LPWSTR szWide = new wchar_t[cchWide];
MultiByteToWideChar(codepage, 0, multi.c_str(), -1, szWide, cchWide);
std::wstring wide(szWide);
delete[] szWide;
return wide;
}
inline std::wstring WideFromUtf8(
std::string const & utf8)
{
return WideFromMulti(utf8, CP_UTF8);
}
然后,您可以LPCWSTR
获得c_str()
。
std::string test_str;
std::wstring test_wstr = WideFromUtf8(test_str);
LPCWSTR wszTest = test_wstr.c_str();
LPWSTR
怎么样?好吧,如果你确定字符串不会被修改,你可以按const_cast<LPWSTR>(wszTest)
投射它。如果您强烈反对const_cast
,则可以创建LPWSTR
的临时副本,如下所示:
std::wstring test(L"Hello world");
LPCWSTR szTestConst = test.c_str();
int cchMax = ::lstrlenW(szTestConst) + 1;
std::vector<WCHAR> v(cchMax);
::lstrcpynW(&v[0], szTestConst, cchMax);
LPWSTR szTest = &v[0];
答案 1 :(得分:0)
我真的不知道为什么,但这解决了它:
case WM_NOTIFY:
pdi = (NMLVDISPINFO*) lParam;
//pi = pdi->item;
switch (pdi->hdr.code)
{
case LVN_GETDISPINFO:
{
//pi.mask = LVIF_TEXT;
pdi->item.mask = LVIF_TEXT;;
//pi.pszText = a[pi.iItem];
pdi->item.pszText = a[pi.iItem];
}
}