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