我正在尝试使用winapi在Rust中创建一个虚拟列表视图。我得到了一个正常的列表视图,但是虚拟列表不会显示任何数据。我将项目数设置为:
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()返回时不会删除字符串。
当我编译和运行代码时,它似乎填充了listview,但没有任何文本可见。
发布于 2016-12-08 17:42:22
if (mask & LVIF_TEXT) == 0此语句正在检查是否存在LVIF_TEXT标志。您需要在出现标志时提供文本:
if (mask & LVIF_TEXT) != 0或者:
if (mask & LVIF_TEXT) == LVIF_TEXT发布于 2016-12-08 14:50:31
您使用的是虚拟列表视图控件,因此不使用LVM_INSERTITEM;相反,只需调用LVM_SETITEMCOUNT设置项计数,列表视图将处理其余部分。特别是,您不应该手工制作LVITEM,特别是不使用LPSTR_TEXTCALLBACK。
更多参考资料:
而且,以A结尾的消息是为了向后兼容而不是Unicode感知的;如果您处理W消息,则不需要处理它们。
https://stackoverflow.com/questions/41035612
复制相似问题