(1) 首先, 设置list 列表的风格
ListView_SetExtendedListViewStyle (m_lvTestList.m_hWnd, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
使得list 控件支持checkbox
LVS_EX_CHECKBOXES | list 的每一个item 都可以使用checkbox 控件, 可以通过使用宏ListView_GetCheckState 来获得checkbox 的状态 |
LVS_EX_FULLROWSELECT | 当一个item 被选中时, 它的所有subitems 也处于被选中状态, 点击任意一个subitem, 则可同时选中整个行. 只适用于LVS_REPORT 风格 |
LVS_EX_GRIDLINES | 网格线, 只适用于LVS_REPORT 风格 |
LVS_EX_HEADERDRAGDROP | 支持列头的拖拽, 只适用于LVS_REPORT 风格 |
LVS_EX_SUBITEMIMAGES | 可在subitem 中插入图标 , 只适用于LVS_REPORT 风格 |
LVS_EX_TRACKSELECT | 如果鼠标停留在某个item 上超过1 秒钟, 则此item 显示为被选中状态. 适用于任何风格的List 控件 |
(2) 当一个checkbox 被check 或uncheck 的时候, 如何获得通知
添加消息映射
ON_NOTIFY(LVN_ITEMCHANGED, IDC_MYLIST, OnItemchangedLinksList)
消息处理函数
void DemoDlg::OnItemchangedLinksList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
*pResult = 0;
if (pNMListView->uOldState == 0 && pNMListView->uNewState == 0)
return; // No change
// Old check box state
BOOL bPrevState = (BOOL)(((pNMListView->uOldState &
LVIS_STATEIMAGEMASK)>>12)-1);
if (bPrevState < 0) // On startup there's no previous state
bPrevState = 0; // so assign as false (unchecked)
// New check box state
BOOL bChecked =
(BOOL)(((pNMListView->uNewState &LVIS_STATEIMAGEMASK)>>12)-1);
if (bChecked < 0) // On non-checkbox notifications assume false
bChecked = 0;
if (bPrevState == bChecked) // No change in check box
return; // Now bChecked holds the new check box state
// ....
}
(3) 设置某个item 的checkbox 的状态
void SetLVCheck (WPARAM ItemIndex, BOOL bCheck)
{
ListView_SetItemState (m_lvTestList.m_hWnd, ItemIndex,
UINT((int(bCheck) + 1) << 12), LVIS_STATEIMAGEMASK);
}
(4) 获得某个item 的checkbox 的状态
使用宏 ListView_GetCheckState(hwndLV, i)