【问题标题】:Sub item in ListView not showing up using Windows API in C++ListView 中的子项未使用 C++ 中的 Windows API 显示
【发布时间】:2017-04-05 12:38:23
【问题描述】:

我有两个函数来初始化列表视图和一个添加条目到列表视图的函数。我创建了一个包含列信息的结构。

struct LISTVIEW_COLUMN
{
    const TCHAR * Title;
    int           Width;
};

这就是我创建列结构的方式

static struct LISTVIEW_COLUMN lvNames[] =
{
    { TEXT("Name"), 150 },
    { TEXT("Last"), 125 }
};

那么我的函数定义如下。

void InitListView(HWND hListView, LISTVIEW_COLUMN * lvColumn, int nCols) 
{

    ListView_SetExtendedListViewStyle(hListView, LVS_EX_FULLROWSELECT);

    // Create the columns
    for (int col = 0; col < nCols; col++) {
        LVCOLUMN lvc;
        lvc.pszText  = (TCHAR *)lvColumn[col].Title;
        lvc.cx       = lvColumn[col].Width;
        lvc.mask     = LVCF_TEXT | LVCF_WIDTH;
        ListView_InsertColumn(hListView, col, &lvc);
    }
}

void NetPCAddListViewRow(HWND hListView, TCHAR * name, TCHAR * lastName)
{
    LVITEM     lvItem;

    // Add item (name)
    lvItem.mask     = LVIF_TEXT | LVIF_IMAGE;
    lvItem.iItem    = 0;
    lvItem.iSubItem = 0;
    lvItem.iImage   = 0;
    lvItem.pszText  = (TCHAR *)name;
    lvItem.iItem    = ListView_InsertItem(hListView, &lvItem);

// Just using "testing" right now to see it as a subitem
    lvItem.iSubItem += 1;
    lvItem.pszText  = _T("testing");
    ListView_SetItem(hListView, &lvItem);
}

这些列显示得很好,第一列“名称”被添加到,但我无法在该列中显示任何内容作为子项?感谢您的帮助!

【问题讨论】:

  • 我看不出有什么明显的错误,除非你没有初始化 LVITEM 结构(尽管理论上这应该无关紧要,因为 mask 字段)。 ListView_SetItemText() 是否可以设置子项文本?也许看看你能不能发一个minimal reproducible example
  • 嗯,我只是尝试使用 ListView_SetItemText() 和同样的东西。我确实检查了 ListView_SetItem() 的返回,它返回“0”。我不知道为什么当 InsertItem 工作正常时会失败?我看看我能不能想出一个小例子来重现它。
  • 尝试将 LVITEM 初始化为 0,就像测试一样。
  • "我确实检查了 ListView_SetItem() 的返回结果,它返回 '0'" - 那么你肯定做错了什么。我同意乔纳森的观点。 总是在使用 API 结构之前将其清零。另外,只是为了检查一下,您是否将 ListView 设置为 Report 视图?
  • 只需设置 LVCOLUMN lvc = { 0 };和 LVITEM lvItem = { 0 };并且仍然这样做。 @RemyLebeau是的,只是想弄清楚现在在哪里。 :\

标签: c++ winapi


【解决方案1】:

如果您查看 MSDN 上的 How to Add List-View Columns 示例,您会看到他们在插入列时设置了 iSubItem 成员和 LVCF_SUBITEM 标志。这建立了子项和列之间的关系(列可以由用户重新排序)。

我还建议您在添加子项之前重置lvItem.mask,因为它们仅支持标志的子集。

【讨论】:

    猜你喜欢
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    相关资源
    最近更新 更多