MFC CListCtrl类checkbox问题

MFC项目用到CListCtrl控件,CListCtrl控件的view设置为list,而且style含有LVS_EX_CHECKBOXES,即每一行最前面都有一个checkbox,那么问题来了,我在勾选和取消checkbox时,怎么捕获checkbox的change消息

2个回答


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;
}

wh230308
冰川人看世界 谢谢,方法可以用。但是偶尔会失败,不知道是不是鼠标的位置有偏差造成的。
接近 5 年之前 回复

响应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)
{
    //........
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐