Win32 List Control 控件
程序员文章站
2024-03-01 13:07:58
...
#前言
List Control
是Win32
中最难用的也是最复杂的空间之一.
我们看下本博客的布局样式
请注意List Control
的view
设置为ViewPort
,其他视图属性可以自行测试。ViewPort
是一个二维的表格视图类型
我们首先插入如下数据:
三个标题栏,和三行数据。
标题栏插入:
/*插入标题行*/
LVCOLUMN lv;
lv.mask = LVCF_FMT| LVCF_WIDTH|LVCF_TEXT;
lv.fmt = LVCFMT_CENTER;
lv.cx = 100;
lv.pszText = (LPTSTR)_T("名称");
LRESULT p = SendDlgItemMessage(hwind, IDC_LV, LVM_INSERTCOLUMN, 0, (LPARAM)&lv);
lv.pszText = (LPTSTR)_T("性别");
SendDlgItemMessage(hwind, IDC_LV,LVM_INSERTCOLUMN,1, (LPARAM)&lv);
lv.pszText = (LPTSTR)_T("住宅");
SendDlgItemMessage(hwind, IDC_LV, LVM_INSERTCOLUMN, 2, (LPARAM)&lv);
第一列名称的插入:
LV_ITEM item;
item.mask = LVIF_TEXT;
item.iItem = 0;
item.iSubItem = 0;
item.pszText = (LPTSTR)_T("王五");
SendDlgItemMessage(hwind, IDC_LV, LVM_INSERTITEM, 0, (LPARAM)&item);
item.iItem = 1;
item.iSubItem = 0;
item.pszText = (LPTSTR)_T("李四");
SendDlgItemMessage(hwind, IDC_LV, LVM_INSERTITEM, 0, (LPARAM)&item);
item.iItem = 2;
item.iSubItem = 0;
item.pszText = (LPTSTR)_T("赵敏");
SendDlgItemMessage(hwind, IDC_LV, LVM_INSERTITEM, 0, (LPARAM)&item);
插入其他列(注意其他列的插入不能用插入第一列的消息)
//插入第一列之外的数据
HWND hwndListView = GetDlgItem(hwind, IDC_LV);
LV_ITEM lvItem;
lvItem.mask = LVIF_TEXT;
//插入第一行数据,这一段代码是不可以少的。
lvItem.iItem = 0;//行号,从0开始
lvItem.iSubItem = 0;//列号,
//第一行
lvItem.iItem = 0;
//第二列
lvItem.iSubItem = 1;
lvItem.pszText = (LPTSTR)_T("女");
ListView_SetItem(hwndListView, &lvItem);
//第一行
lvItem.iItem = 0;
//第三列
lvItem.iSubItem =2;
lvItem.pszText = (LPTSTR)_T("广州");
SendDlgItemMessage(hwind, IDC_LV, LVM_SETITEM, 0, (LPARAM)&lvItem);
//第二行
lvItem.iItem = 1;
//第二列
lvItem.iSubItem = 1;
lvItem.pszText = (LPTSTR)_T("男");
SendDlgItemMessage(hwind, IDC_LV, LVM_SETITEM, 0, (LPARAM)&lvItem);
我们在实现以下上图的表格线和选中某一行的时候高亮
//获取旧的样式
DWORD oldStyle = SendDlgItemMessage(hwind, IDC_LV, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
//拼接新的样式
oldStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
SendDlgItemMessage(hwind, IDC_LV, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, oldStyle);
实现打印选中行和删除选中行等
//获得选中行
DWORD result = SendDlgItemMessage(hwind, IDC_LV, LVM_GETSELECTIONMARK, 0, 0);
TCHAR d[10] = { 0 };
_stprintf_s(d,_T("选中%d"),result);
LVITEM lvi;
lvi.mask = LVIF_TEXT;
lvi.iItem = result;
lvi.iSubItem = 0;
lvi.pszText = d;
lvi.cchTextMax = sizeof(d);
//获取选中行第0列的文字 这应该输出王五
SendDlgItemMessage(hwind, IDC_LV, LVM_GETITEMTEXT, result, (LPARAM)&lvi);
//删除选中行
SendDlgItemMessage(hwind, IDC_LV, LVM_DELETEITEM, result, 0);