(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)
本文介绍了如何在Windows编程中为ListView控件添加CheckBox支持,包括设置ListView风格以显示CheckBox,处理LVN_ITEMCHANGED通知来响应CheckBox状态改变,以及设置和获取特定项的CheckBox状态的方法。
2066

被折叠的 条评论
为什么被折叠?



