手动创建列表控件
// IDC_MY_LIST 为自定义 ID 号
m_List.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | LVS_REPORT | LVS_EDITLABELS, // 基础样式
recList, // 位置
this, // 父窗口指针
IDC_MY_LIST); // 资源 ID
m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_List.ShowWindow(SW_SHOW);
双击单元格,获得行列索引
void classname::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
// 获得行、列索引
int nItem = pNMItemActivate->iItem;
int nSubItem = pNMItemActivate->iSubItem;
POSITION pos = m_listIn.GetFirstSelectedItemPosition();
while (pos)// 当点击位置是在列表内时,执行循环体// 也可以用 if 判断
{
// Add your code...
return;
}
}
风格样式
几个常用的风格
m_list.SetExtendedStyle(m_list.GetExtendedStyle()
| LVS_EX_FULLROWSELECT /* */
| LVS_EX_GRIDLINES /* 网格 */
| LVS_EX_DOUBLEBUFFER); /* 虚拟列表双缓存 */
m_list.InsertColumn(0, _T("名字"), LVCFMT_CENTER, 50);
m_list.InsertColumn(1, _T("身高"), LVCFMT_CENTER, 60);
m_list.InsertColumn(2, _T("体重"), LVCFMT_CENTER, 60);
m_list.InsertColumn(3, _T("测量时间"), LVCFMT_CENTER, 180);
m_list.InsertItem(0, _T("张三"));
m_list.SetItemText(0, 1, _T("178CM"));
m_list.SetItemText(0, 2, _T("70KG"));
m_list.SetItemText(0, 3, _T("2009年1月15日23时40分"));
虚拟列表
- 用 OnTimer、 .Invalidate()、 .UpdateWindow() 控制数据刷新频率
- 用 LVS_EX_DOUBLEBUFFER 风格样式控制闪烁
- 用 memDC 也可以控制闪烁
- 用 m_list.SetItemCount() 设置显示行数,而不是 InsertItem
// 显示列表信息
void CDlgPageInput::OnLvnGetdispinfoListIn(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
LV_ITEM *pDispItem = &(pDispInfo)->item;
*pResult = 0;
if ((pDispItem->mask & LVIF_TEXT))
{
switch (pDispItem->iSubItem)
{
case 0:// 示例
_stprintf_s(pDispItem->pszText, 128, _T(""), ....); break;
break;
case 1:// 示例
lstrcpy(pDispItem->pszText, ....); break;
//......
default:
break;
}
}
}
获得单元格 Rect
CRect CMyList::GetCellRect(int idxRow, int idxCol)
{
CRect recCell;
if (idxCol > 0)
{
GetSubItemRect(idxRow, idxCol, LVIR_BOUNDS, recCell);
}
else
{
GetItemRect(idxRow, recCell, LVIR_BOUNDS);
recCell.right = GetColumnWidth(0);
recCell.left = 0;
}
return recCell;
}