虚拟listview不显示任何文本

虚拟listview不显示任何文本,listview,winapi,rust,Listview,Winapi,Rust,我正在尝试使用winapi在Rust中创建一个虚拟listview。我得到了一个正常的listview工作,但虚拟的不会显示任何数据。 我使用以下选项设置项目数: user32::SendMessageW(list_hwnd, winapi::LVM_SETITEMCOUNT, (ALL_DATA.read().unwrap().len()-1) as u64, 0); 我使用以下方法创建列表: let style = WS_VISIBLE | WS_CHILD | WS_TABSTOP |

我正在尝试使用winapi在Rust中创建一个虚拟listview。我得到了一个正常的listview工作,但虚拟的不会显示任何数据。 我使用以下选项设置项目数:

user32::SendMessageW(list_hwnd, winapi::LVM_SETITEMCOUNT, (ALL_DATA.read().unwrap().len()-1) as u64, 0);
我使用以下方法创建列表:

let style = WS_VISIBLE | WS_CHILD | WS_TABSTOP |
            LVS_NOSORTHEADER | LVS_OWNERDATA | LVS_AUTOARRANGE |
            LVS_SINGLESEL | LVS_REPORT;
let hwnd = user32::CreateWindowExW(
    0,
    wc.as_ptr() as *mut _,
    to_wstring("").as_ptr() as *mut _,
    style,
    0,
    0,
    rc_client.right - rc_client.left,
    rc_client.bottom - rc_client.top,
    hwnd_parent,
    0 as HMENU,
    // IDC_MAIN_LISTVIEW,
    h_instance,
    std::ptr::null_mut()
);
LVN\u getdispinow
消息中,我尝试添加以下文本:

if (mask & LVIF_TEXT) == 0 {
    let len = ALL_DATA.read().unwrap().len();
    if ix >= len - 1 {
        println!("ix bigger then index! ix: {:?} len: {:?}", ix, len);
        return 0;

    }
    let ref item = ALL_DATA.read().unwrap()[ix];

    let f = |key| {
        let ref vec = STRING_CACHE.read().unwrap()[(key)];
        let ptr = STRING_CACHE.read().unwrap()[(key)].as_ptr();
        (ptr, vec.len())
    };

    let (ptr, _) = match (*(l_param as *const NMLVDISPINFOW)).item.iSubItem {
        0 => f(&item.item),
        1 => f(&item.sub_item),
        n => {
            println!("Found subitem: {:?}", n);
            return 0;
        }
    };

    // Try to set text in dispinfo
    (*(l_param as *mut NMLVDISPINFOW)).item.pszText = ptr as LPWSTR;

    return 0;
}
STRING\u缓存
是一个
HashMap
。我使用它是为了在从
窗口返回时不会删除字符串

当我编译并运行代码时,它似乎填充了listview,但没有可见的文本


您使用的是一个虚拟列表视图控件,因此不使用LVM_INSERTITEM;相反,您只需调用
LVM_SETITEMCOUNT
来设置项目计数,然后列表视图将处理其余部分。特别是,您不应该手动创建
LVITEM
s,尤其不应该使用
LPSTR\u TEXTCALLBACK

更多参考资料:

另外,以
A
结尾的消息用于向后兼容,不支持Unicode;如果您处理
W
消息,则不需要处理它们

if (mask & LVIF_TEXT) == 0
此语句检查
LVIF_TEXT
标志是否不存在。当标志出现时,您需要提供文本:

if (mask & LVIF_TEXT) != 0
或:


我以前确实试过这个,很抱歉这么说。我已经更新了SETITEMCOUNT的代码。我使用WideString并确保指针存在,它似乎设置在项目上,但仍然没有可见的文本。指针是否必须位于globalalloc或类似的位置?如果您进行检查,您将在
pszText
字段文档中看到指针必须在“收到下一个通知之前”保持有效。我不知道这是否意味着在下一次
LVN_GETDISPINFO
之后,对于任何单元格或所讨论的特定单元格,它确实意味着它必须在您从窗口过程返回后继续存在。我不知道如何在生锈的环境中做到这一点;对不起,谢谢你。我已经将所有字符串存储在一个全局变量中,只要程序在运行,它们都是有效的。我甚至尝试过用GlobalAlloc分配它们,但列表视图中仍然没有文本。
if (mask & LVIF_TEXT) == LVIF_TEXT