ListView插入节点的流程

ListView控件的样式被设置成report时,ListView控件实际上是分为两个部分, 一部分是Column, 这个部分是用来显示ListView的每一列的标题.
另一部分是Item, 每一个Item就是一行记录,一行记录中可以分成对应每一个'Column'的列,故一个ListView有多少个Column,一行Item就有多少列.
一个ListVie控件如下表所示:



Column1

Column2

Column3

Item0_0

Item0_1

Item0_2

Item1_0

Item1_1

Item1_2



插入流程

先插入column,再插入item.
ListView控件使用一个结构体来表示一个Column, 因此,插入一个column相当于插入一个设置信息的结构体.
结构体的字段含义如下:

typedef struct tagLVCOLUMNW
{
 UINT mask; // 用于记录结构体中哪些字段被使用的,如果这个字段没有被赋上相应的值,即使其他字段被赋值了函数也不会使用
 int fmt; // 用于记录格式一个Column的格式
 int cx; // 用于记录Column的宽度
 LPWSTR pszText; // 用于记录Column的显示的文本
 int cchTextMax; // 用于记录Column的显示的文本的字符个数
 int iSubItem; // 用于记录Column的位置
 int iImage; // 用于记录Column使用到的图标在图标链表中的索引
 int iOrder; 
#if (NTDDI_VERSION >= NTDDI_VISTA) 
 int cxMin; 
 int cxDefault;
 int cxIdeal; 
#endif
} LVCOLUMNW, *LPLVCOLUMNW;
在这个结构体中, maskfmt这两个字段用一些宏来控制,这些宏分别是:

mask字段所使用到的宏

  • LVCF_FMT : fmt字段被使用.
  • LVCF_WIDTH : cx 字段被使用.
  • LVCF_TEXT : pszText 字段被使用.
  • LVCF_SUBITEM : iSubItem 字段被使用
  • LVCF_IMAGE : iImage 字段被使用
  • LVCF_ORDER : iOrder 字段被使用
  • LVCF_MINWIDTH : cxMin 字段被使用
  • LVCF_DEFAULTWIDTHcxDefault 字段被使用
  • LVCF_IDEALWIDTHcxIdeal 字段被使用

实例代码


// 获取ListView控件的窗口句柄
HWND hListView = GetDlgItem(hWnd , 0x1000);
// 插入Column
LV_COLUMN stcColumn = { 0 };
stcColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;// 设置要使用的字段: 宽度,格式,文本
stcColumn.fmt = LVCFMT_CENTER; //文字居中对齐
stcColumn.cx = 70; // 宽度
stcColumn.pszText = L"姓名"; //设置要显示文本
ListView_InsertColumn(hListView , 0 , &stcColumn);
// 继续插入一个Column
stcColumn.pszText = L"年龄";
ListView_InsertColumn(hListView , 1 , &stcColumn);
// 继续插入一个Column
stcColumn.pszText = L"性别";
ListView_InsertColumn(hListView , 2, &stcColumn);
// 插入节点
// 节点是按行插入的, 一行就是一个节点
// 每个节点被分成对应的列,有多少个Column就有多少列
// 
LV_ITEM stcItem = { 0 };
stcItem.mask = LVIF_TEXT; // 设置要使用的字段: 文本
stcItem.iItem = 0; // 设置插入到的行号
ListView_InsertItem(hListView , &stcItem); // 插入一行
ListView_SetItemText(hListView , /*要插入行的listview句柄*/
 0 , /*行号*/
 0 , /*列号*/
 L"王大锤"/*文本*/
 );// 设置一行中的第0列
ListView_SetItemText(hListView , 
 0 , /*行号*/
 1 , /*列号*/
 L"18"); // 设置一行中的第1列
ListView_SetItemText(hListView , 0 , 2 , L"男");// 设置一行中的第3列
stcItem.iItem = 1; // 设置要插入到的行号
ListView_InsertItem(hListView , &stcItem);
ListView_SetItemText(hListView , 
 1 , /*行号*/
 0 , /*列号*/
 L"王小锤");
ListView_SetItemText(hListView , 1 , 1 , L"28");
ListView_SetItemText(hListView , 1 , 2 , L"男");