参考博客原址:https://blog.csdn.net/xiaofen17458/article/details/106240230
MFC List Control复选框的用法
-
如何给list control的每一项都添加复选框
OnInitDialog函数中添加以下代码,m_DataList是List control所绑定控件变量CListCtrl m_DataList;
m_DataList.SetExtendedStyle(LVS_EX_CHECKBOXES); //设置列表控件使用复选框
2.设置复选框为选中状态
m_DataList.SetCheck(nItemOrder,TRUE); // nItemOrder为行号
3.设置复选框为未选中状态
m_DataList.SetCheck(nItemOrder,FALSE); // nItemOrder为行号
4.得到list某一行复选框的状态
BOOL bCheckStatus;
bCheckStatus = m_DataList.GetCheck(nItemOrder);
5.鼠标选中list某一行后复选框状态要发生改变
- 给 list控件添加消息
- 修改生成的函数
void CDataManageDlg::OnNMClickListIpaddress(NMHDR *pNMHDR, LRESULT *pResult)
{
// 鼠标点击某一项时改变checkbox状态
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
BOOL bCheckStatus;
bCheckStatus = m_IpList.GetCheck(pNMLV->iItem);
m_IpList.SetCheck(pNMLV->iItem,!bCheckStatus);
*pResult = 0;
}
6.鼠标选中list多行,被选中项的复选框发生改变
- 改变list控件属性
- list控件添加消息
- 修改函数体
void CDataManageDlg::OnLvnItemchangedListData(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
//复选框状态发生变化,记录check状态的索引
if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(1)) /* old state : unchecked */
&& (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(2))) /* new state : checked */
{
//未勾选->勾选,存入vector ,m_vecCheckItem用来记录被选中项的序号
m_vecCheckItem.push_back(pNMLV->iItem);
}
else if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(2)) /* old state : checked */
&& (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(1))) /* new state : unchecked */
{
//勾选->未勾选,从vector中将对应序号删掉
vector<int>::iterator iter;
for(iter=m_vecCheckItem.begin();iter!=m_vecCheckItem.end();iter++)
{
//从vector中删除指定的某一个元素
if(*iter == pNMLV->iItem)
{
m_vecCheckItem.erase(iter);
break;
}
}
}
// 选中项发生改变
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->uChanged==LVIF_STATE)
{
if(pNMListView->uNewState & LVIS_SELECTED)
{
//处理内容
BOOL bCheckStatus;
bCheckStatus = m_DataList.GetCheck(pNMLV->iItem);
m_DataList.SetCheck(pNMLV->iItem,!bCheckStatus);
}
}
*pResult = 0;
}