首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚拟列表视图不显示任何文本

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

Stack Overflow用户
提问于 2016-12-08 09:10:53
回答 2查看 266关注 0票数 1

我正在尝试使用winapi在Rust中创建一个虚拟列表视图。我得到了一个正常的列表视图,但是虚拟列表不会显示任何数据。我将项目数设置为:

代码语言:javascript
复制
user32::SendMessageW(list_hwnd, winapi::LVM_SETITEMCOUNT, (ALL_DATA.read().unwrap().len()-1) as u64, 0);

我创建该列表的本身包括:

代码语言:javascript
复制
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消息中,我尝试用以下内容添加文本:

代码语言:javascript
复制
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_CACHEHashMap<String, Vec<u16>>。我使用它,以便在从window_prow()返回时不会删除字符串。

当我编译和运行代码时,它似乎填充了listview,但没有任何文本可见。

完整的代码可以在GitHub找到

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-08 17:42:22

代码语言:javascript
复制
if (mask & LVIF_TEXT) == 0

此语句正在检查是否存在LVIF_TEXT标志。您需要在出现标志时提供文本:

代码语言:javascript
复制
if (mask & LVIF_TEXT) != 0

或者:

代码语言:javascript
复制
if (mask & LVIF_TEXT) == LVIF_TEXT
票数 1
EN

Stack Overflow用户

发布于 2016-12-08 14:50:31

您使用的是虚拟列表视图控件,因此不使用LVM_INSERTITEM;相反,只需调用LVM_SETITEMCOUNT设置项计数,列表视图将处理其余部分。特别是,您不应该手工制作LVITEM,特别是不使用LPSTR_TEXTCALLBACK

更多参考资料:

而且,以A结尾的消息是为了向后兼容而不是Unicode感知的;如果您处理W消息,则不需要处理它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41035612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档