我正在尝试使用winapi在Rust中创建虚拟列表视图。我有一个正常的listview工作,但虚拟的一个不会显示任何数据。 我用以下项目设置了项目数:
actionLogin()
我用以下内容创建列表:
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_GETDISPINFOW
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_CACHE
。我使用它,因此从HashMap<String, Vec<u16>>
返回时不会删除字符串。
当我编译并运行代码时,它似乎填充了listview但没有文本可见。
答案 0 :(得分:1)
if (mask & LVIF_TEXT) == 0
此语句检查LVIF_TEXT
标志是否是否存在。当标志 IS 存在时,您需要提供文本:
if (mask & LVIF_TEXT) != 0
或者:
if (mask & LVIF_TEXT) == LVIF_TEXT
答案 1 :(得分:0)
您正在使用虚拟列表视图控件,因此您不使用LVM_INSERTITEM
;相反,您只需调用LVM_SETITEMCOUNT
来设置项目计数,然后列表视图将处理其余部分。特别是,您不应手动LVITEM
,尤其不要使用LPSTR_TEXTCALLBACK
。
更多参考资料:
此外,以A
结尾的消息是为了向后兼容并且不支持Unicode;如果您处理W
消息,则无需处理它们。