我想创建一个使用winapi的Rust虚拟列表视图。我有一个正常的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_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>>
。我使用这个,所以从window_prow()
返回时字符串不会丢失。
当我编译并运行代码时,它似乎填充了列表视图,但没有文字可见。
The complete code can be found at GitHub。
omg,我是一个阻碍!谢谢您的帮助 :) –