最近MFC项目使用CListCtrl控件时,遇到一些问题,记录下。
当CListCtrl::SetExtendedStyle包含了LVS_EX_CHECKBOXES项时,控件的每一行最前面都会显示一个checkbox。但实际上,并不是真正的checkbox控件,而是一张勾选状态的image和未勾选状态的image,点击时勾选状态和未勾选状态的切换就是在两张image间切换。
有时候,我们点击checkbox时,需要响应状态改变消息。前面说的,它不是checkbox控件,因此没办法用checkbox控件的方式响应消息。
可以添加CListCtrl控件的NM_CLICK消息处理程序。代码如下:
void CMFCApplication2Dlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: Add your control notification handler code here
DWORD dwPos = GetMessagePos();
CPoint pt(dwPos);
m_ctlList1.ScreenToClient(&pt);
UINT nFlag;
int nItem = m_ctlList1.HitTest(pt, &nFlag);
if (nFlag == LVHT_ONITEMSTATEICON)
{
BOOL bCheckState = m_ctlList1.GetCheck(nItem);
//注意,bCheckState为TRUE,checkbox从勾选状态变为未勾选状态
if (bCheckState)
{
//...............
}
else
{
//...............
}
}
*pResult = 0;
}
如有不对的地方欢迎大家指正,或者大家有更好的方法请分享一下。