问题描述
- MFC CListCtrl类checkbox问题
-
MFC项目用到CListCtrl控件,CListCtrl控件的view设置为list,而且style含有LVS_EX_CHECKBOXES,即每一行最前面都有一个checkbox,那么问题来了,我在勾选和取消checkbox时,怎么捕获checkbox的change消息
解决方案
void CStatusBarDlg::OnClickStateList(NMHDR* pNMHDR, LRESULT* pResult)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_StatusList.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;
UINT nFlag;
int nItem = m_StatusList.HitTest(point, &nFlag);
//判断是否点在checkbox上
if(nFlag == LVHT_ONITEMSTATEICON)
{
TRACE("You click CheckBox,Item will be Clicked!");
}
*pResult = 0;
}
解决方案二:
响应LVN_ITEMCHANGED这个消息,下面是一段示例代码
LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);
*pResult = 0;
CManageBillDoc *pDoc = GetDocument();
POSITION pos = m_DataList.GetFirstSelectedItemPosition();
while(pos)
{
int nItem = m_DataList.GetNextSelectedItem(pos);
pDoc->m_nSelectItemID = (long)m_DataList.GetItemData(nItem);
}
if(pNMLV->uOldState == 0 && pNMLV->uNewState == 0)//行CheckBox状态没有变化
{
return;
}
//原始状态
BOOL bPrevState = (BOOL)(((pNMLV->uOldState & LVIS_STATEIMAGEMASK) >> 12) - 1);
if(bPrevState < 0)//控件刚刚创建,没有原始状态
{
bPrevState = 0;//就可以认为本项原始状态是未选中的状态
}
//新状态
BOOL bNewState = (BOOL)(((pNMLV->uNewState & LVIS_STATEIMAGEMASK) >> 12) - 1);
if(bNewState < 0)//没有LVS_EX_CHECKBOX状态的ListCtrl
{
bNewState = 0;
}
if(bNewState == bPrevState)//checkbox状态没有改变
return;
else if(bNewState)
{
//........
}
时间: 2024-09-17 03:47:37