应用程序可以使用LVM_INSERTITEM消息将项目添加到列表视图控件。由LV_ITEM结构指定的列表视图项目的属性包括状态,标签,图标和项目数据。与每个项目相关联的可能是一个或多个子项目,它们是报表视图中项目右侧显示的字符串。
本节中的示例为文本文件中的每一行添加列表视图项。假设分号分隔项目标签和跟随它的子项目字符串。该示例将每个项目的标签和子项目字符串保存在应用程序头文件中定义的结构中,如下所示。
#define C_COLUMNS 6
typedef struct myitem_tag {
LPSTR aCols[C_COLUMNS];
} MYITEM;
应用程序填写LV_ITEM结构,并使用LVM_INSERTITEM消息添加列表视图项。因为应用程序将项目标签保存在自己的应用程序定义的MYITEM结构中,所以它为LV_ITEM结构的pszText成员指定了LPSTR_TEXTCALLBACK值。指定此值将导致控件在需要显示该项目时向其所有者窗口发送LVN_GETDISPINFO通知消息。应用程序定义的结构的地址保存为项目数据。
// InitListViewItems - 将项目和子项添加到列表视图。
//如果成功返回TRUE,否则返回FALSE。
// hwndLV - 列表视图控件的句柄
// pfData - 包含列的视图项的文本文件
//用分号分隔
BOOL WINAPI InitListViewItems(HWND hwndLV, FILE *pfData)
{
extern char g_achTemp[256]; //临时缓冲区
PSTR pszStart;
PSTR pszEnd;
int iItem;
int iSubItem;
LV_ITEM lvi;
//初始化所有项目通用的LV_ITEM成员。
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
lvi.state = 0;
lvi.stateMask = 0;
lvi.pszText = LPSTR_TEXTCALLBACK; // app。维护文字
lvi.iImage = 0; //图像列表索引
//读取指定文件中的每一行。
for (iItem = 0;
fgets(g_achTemp, sizeof(g_achTemp), pfData);
的iItem ++){
//分配应用程序定义的结构来存储
//项目标签和每个子项目的文本。
MYITEM *pItem = LocalAlloc(LPTR, sizeof(MYITEM));
//复制第一个字符串(标签)。
pszEnd = strchr(g_achTemp, ';');
*pszEnd = '\0';
pItem->aCols[0] = DupString(g_achTemp);
//复制后续字符串(子项)。
for (iSubItem = 1;
iSubItem < C_COLUMNS && pszEnd != NULL;
iSubItem ++){
pszStart = pszEnd + 1;
if ((pszEnd = strchr(pszStart, ';')) != NULL)
*pszEnd = '\0';
pItem->aCols[iSubItem] = DupString(pszStart);
}
//初始化项目特定的LV_ITEM成员。
lvi.iItem = iItem;
lvi.iSubItem = 0;
lvi.lParam = (LPARAM) pItem; //项目数据
//添加项目。
ListView_InsertItem(hwndLV, &lvi);
//不需要设置子项的文本。他们
//默认为LPSTR_TEXTCALLBACK。
}
return TRUE;
}
// DupString - 分配一个字符串的副本。
// lpsz - 要复制的以null结尾的字符串的地址
LPSTR DupString(LPSTR lpsz)
{
int cb = lstrlen(lpsz) + 1;
LPSTR lpszNew = LocalAlloc(LMEM_FIXED, cb);
if (lpszNew != NULL)
CopyMemory(lpszNew, lpsz, cb);
return lpszNew;
}