1. 首先类向导生成一个 CListCtrl 控件对象 m_listDO
2. 添加CImageList对象,并与m_listDO绑定
m_imgList.Create(16, 16, ILC_COLOR24, 2, 2);
m_imgList.Add(AfxGetApp()->LoadIcon(IDI_OFF));
m_imgList.Add(AfxGetApp()->LoadIcon(IDI_ON));
m_listDO.SetImageList(&m_imgList, LVSIL_SMALL);
3. 初始化m_listDO添加表头和行数据
CString str;
str = _T("描述");
m_listDO.InsertColumn(0, str, LVCFMT_LEFT, 180);
str = _T("状态");
m_listDO.InsertColumn(1, str, LVCFMT_LEFT, 40);
m_listDO.SetExtendedStyle(m_listDO.GetExtendedStyle() |
LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES |
LVS_EX_SUBITEMIMAGES | LVS_EX_CHECKBOXES | LVS_EX_UNDERLINEHOT);
m_listDO.SetFont(g_param.GetGridFont()); // 用字体把行间距拉大
CString strDO[] = {
L"DO_00 ",
L"DO_01 ",
L"DO_02 ",
L"DO_03 ",
L"DO_04 ",
L"DO_05 ",
L"DO_06 ",
L"DO_07 "
};
for (int i = 0; i < 8; i++)
{
m_listDO.InsertItem(i, strDO[i], 2); // 这里用2, 表示不显示图标
m_listDO.SetItem(i, 1, LVIF_IMAGE, NULL, 0, 0, 0, 0); // 第二列设置图标
}
4. 响应 LVN_ITEMCHANGED 消息,处理复选框操作
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LS_DO, OnItemchangedLsDo)
void CDlg::OnItemchangedLsDo(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if((pNMListView->uOldState & INDEXTOSTATEIMAGEMASK(1)) /* old state : unchecked */
&& (pNMListView->uNewState & INDEXTOSTATEIMAGEMASK(2)) /* new state : checked */
)
{
//Item被选中(pNMListView->iItem)
}
else if((pNMListView->uOldState & INDEXTOSTATEIMAGEMASK(2)) /* old state : checked */
&& (pNMListView->uNewState & INDEXTOSTATEIMAGEMASK(1)) /* new state : unchecked */
)
{
//Item未被选中(pNMListView->iItem)
}
else
{
//未改变选中状态(pNMListView->iItem)
}
*pResult = 0;
}