(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)