虚拟列表视图不显示任何文本

时间:2016-12-08 09:10:53

标签: listview winapi rust

我正在尝试使用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但没有文本可见。

complete code can be found at GitHub

2 个答案:

答案 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消息,则无需处理它们。