控件类名
SysListView32
要包含头文件:
#include <commctrl.h>
控件的创建
HINSTANCE hInstance = GetModuleHandle(NULL);
//创建报表样式的列表视图
HWND hListCtrl = CreateWindowEx(WS_EX_CLIENTEDGE,
TEXT("SysListView32"), nullptr,
WS_VISIBLE | WS_CHILD | LVS_REPORT,
10, 10, 400, 300,
hWnd, HMENU(1001), hInstance, 0);
控件样式
标红的为常用控件样式
样式名称 | 说明 |
---|---|
LVS_ALIGNLEFT | 当显示格式是大图标或小图标时,标题放在图标的左边.缺省情况下标题放在图标的下面. |
LVS_ALIGNTIP | 当显示格式是大图标或小图标时,标题放在图标的上边 |
LVS_AUTOARRANGE | 当显示格式是大图标或小图标时,自动排列控件中的表项 |
LVS_EDITLABELS | 用户可以修改标题 |
LVS_ICON | 指定大图标显示格式. |
LVS_LIST | 指定列表显示格式. |
LVS_NOCOLUMNHEADER | 在报告格式中不显示列的表头. |
LVS_NOLABELWRAP | 当显示格式是大图标时,使标题单行显示.缺省时是多行显示. |
LVS_NOSCROLL | 列表视图无滚动条. |
LVS_NOSORTHEADER | 报告列表视图的表头不能作为排序按钮使用. |
LVS_OWNERDRAWFIXED | 由控件的拥有者负责绘制表项. |
LVS_REPORT | 指定报表显示格式. |
LVS_SHAREIMAGELISTS | 使列表视图共享图像序列 |
LVS_SHOWSELALWAYS | 即使控件失去输入焦点,仍显示出项的选择状态. |
LVS_SINGLESEL | 指定一个单选择列表视图.缺省时可以多项选择 |
LVS_SMALLICON | 指定小图标显示格式 |
LVS_SORTASCENDING | 按升序排列表项. |
LVS_SORTDESCENDING | 按降序排列表项. |
常用消息
1.LVM_INSERTCOLUMN
插入列消息
参数:
WPARAM: 列的索引
LPARAM: LPVOCLUMN结构体
返回: 新插入列的索引或-1
代码示例:
//在第一列插入姓名
LVCOLUMN lvCol = { 0 };
lvCol.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
lvCol.fmt = LVCFMT_LEFT;
lvCol.iSubItem = 0;
lvCol.cx = 100;
lvCol.pszText = (LPTSTR)TEXT("姓名");
//ListView_InsertColumn(hListCtrl, 0, &lvCol);//等同于下面的语句
SendMessage(hListCtrl,LVM_INSERTITEM,0,&lvCol);
//在第二列插入性别
lvCol.iSubItem = 1;
lvCol.cx = 50;
lvCol.pszText = (LPTSTR)TEXT("性别");
SendMessage(hListCtrl,LVM_INSERTITEM,0,&lvCol);
//第三列插入年龄
//...
2.LVM_INSERTITEM
插入新行数据
参数:
WPARAM: 必须=0
LPARAM:LVITEM结构体指针
返回:
新添加项的索引或-1
代码示例:
LVITEM lvItem = { 0 };
lvItem.mask = LVIF_TEXT | LVIF_IMAGE;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.pszText = (LPTSTR)TEXT("张三");
lvItem.iImage = 0;
ListView_InsertItem(hListCtrl, &lvItem);
lvItem.iItem = 1;
lvItem.iSubItem = 0;
lvItem.pszText = (LPTSTR)TEXT("赵林林");
lvItem.iImage = 0;
ListView_InsertItem(hListCtrl, &lvItem);
插入行数据只插入第一列的数据,要插入后面的列就要用LVM_SETITEMTEXT消息设置
3.LVM_SETITEMTEXT
设置指定列索引要显示的字符串
参数:
WPARAM: 行的索引
LPARAM: LVITEM结构体指针
返回:
BOOL
代码示例:
lvItem.iSubItem = 1;
lvItem.pszText = (LPTSTR)TEXT("男");
SendMessage(hListCtrl,LVM_SETITEMTEXT, 0,(LPARAM)&lvItem);
lvItem.iSubItem = 2;
lvItem.pszText = (LPTSTR)TEXT("33");
SendMessage(hListCtrl, LVM_SETITEMTEXT, 0, (LPARAM)&lvItem);
lvItem.iSubItem = 1;
lvItem.pszText = (LPTSTR)TEXT("女");
SendMessage(hListCtrl, LVM_SETITEMTEXT, 1, (LPARAM)&lvItem);
lvItem.iSubItem = 2;
lvItem.pszText = (LPTSTR)TEXT("23");
SendMessage(hListCtrl, LVM_SETITEMTEXT, 1, (LPARAM)&lvItem);
4.LVM_GETSELECTIONMARK
获得当前种项的索引
int nSel=(int)SendMessage(hListCtrl,LVM_GETSELECTIONMARK,0,0);
###5.LVM_GETITEMTEXT
获得指定行,指定列显示的字符串
//获得选中行第一列的字符串
TCHAR szStr[100]={0};
LVITEM lvItem = { 0 };
lvItem.mask = LVIF_TEXT;
lvItem.iSubItem = 0; //列索引
lvItem.iItem = nSel; //行索引
lvItem.cchTextMax = 100; //最大字符串缓存大小
lvItem.pszText = (LPTSTR)szStr;
SendMessage(m_hWnd, LVM_GETITEMTEXT, nSel, (LPARAM)&lvItem);
常用通知消息
LVN_ITEMCHANGED
选中项改变消息
在父窗口捕获WM_NOTIFY消息
LPNMLISTVIEW lpnmLv=(LPNMLVITEW)lParam;
if(lpnmLv->hdr.code == LVM_ITEMCHANGED &&
lpnmLv->uNewState & LVIS_SELECTED)
{
TCHAR szStr[100]={0};
int nSel=lpnmLv->iItem;
HWND hList=lpnmLv->hdr.hwndFrom;
LVITEM lvItem = { 0 };
lvItem.mask = LVIF_TEXT;
lvItem.iSubItem = 0; //列索引
lvItem.iItem = nSel; //行索引
lvItem.cchTextMax = 100; //最大字符串缓存大小
lvItem.pszText = (LPTSTR)szStr;
SendMessage(hList, LVM_GETITEMTEXT, nSel, (LPARAM)&lvItem);
MessageBox(hWnd,szStr,TEXT("提示信息"),MB_OK);
}