我想使用List-View控件在“网格”中显示 LDAP 搜索的结果。我写了一些测试代码来看看它是如何工作的,但它没有按照我想要的方式显示。据我了解,每个Item相当于一个“行”(使用LVS_REPORT样式),而Subitem相当于一个“列”(例如,对于每个项目,我可以显示多个子项目,每个子项目在同一行的单独列中) .
这是我的测试代码,目前设置为创建四列,有一个 Item 和四个 Subitems(对应于四列)。两个功能:一个用于创建列,另一个用于插入项目。
int CreateColumns(HWND *hwndlistbox)
{
wchar_t *cnames[100];
LVCOLUMN lvc;
int i;
cnames[0] = L"column1";
cnames[1] = L"column2";
cnames[2] = L"column3";
cnames[3] = L"column4";
cnames[4] = NULL;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
for (i = 0; cnames[i] != NULL; i++)
{
lvc.iSubItem = i;
lvc.pszText = cnames[i];
lvc.cx = 100;
lvc.fmt = LVCFMT_LEFT;
ListView_InsertColumn(*hwndlistbox, i, &lvc);
}
return i;
}
void InsertItems(HWND *hwndlistbox, int *columncount)
{
LVITEM lvi;
wchar_t *items[100];
int i, j;
items[0] = L"text1";
items[1] = L"text2";
items[2] = L"text3";
items[3] = L"text4";
items[4] = NULL;
lvi.mask = LVIF_TEXT;
lvi.iItem = 0;
for (i = 0; i < *columncount; i++)
{
lvi.pszText = items[i];
lvi.iSubItem = i;
ListView_InsertItem(*hwndlistbox, &lvi);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这会lvi.iItem = 0;在每列 ( lvi.iSubItem = i;)下生成带有文本字符串的单行( )。这是它显示的内容:

更改lvi.iSubItem = i为lvi.iSubItem = 0导致每个文本字符串在第一列中显示为新行:

我打它周围,两个硬编码的数字iItem和iSubItem,同时改变对i的,但我不能让它显示的文字比任何地方的第一列等。我究竟做错了什么?
首先,您的cnames和items数组被声明为指针数组,但您并没有为它们分配内存;您需要将它们声明为字符串数组,例如wchar_t cnames[100][40];.
其次,您需要使用ListView_InsertItem插入项并设置第一列的值,然后使用ListView_SetItem添加其他列,例如
lvi.pszText = items[0];
lvi.iSubItem = 0;
ListView_InsertItem(*hwndlistbox, &lvi);
for (i = 1; i < *columncount; i++)
{ lvi.pszText = items[i];
lvi.iSubItem = i;
ListView_SetItem(*hwndlistbox, &lvi);
}
Run Code Online (Sandbox Code Playgroud)