虚拟listview不显示任何文本
我正在尝试使用winapi在Rust中创建一个虚拟listview。我得到了一个正常的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 |
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