使用std :: vector <std :: string>填充虚拟ListView

时间:2017-07-09 22:43:09

标签: c++ listview winapi vector

我有一个包含数千个字符串的向量:

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仍然是空的,而不是显示元素。

2 个答案:

答案 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];   
        }
    }