在CListCtrl中区分用户单击和SetChecked()

时间:2015-02-18 11:37:33

标签: mfc click clistctrl

我有一个带有复选框的CListCtrl,我需要根据某些外部因素启用或禁用它们。但是,当我在列表中有更多可以显示的项目时,我不能在控件上使用EnableWindow(FALSE),因为它还会禁用滚动条。

所以,我已经搜索并在消息映射中提出以下代码:

ON_NOTIFY(LVN_ITEMCHANGED, IDC_CHECKBOX_LIST, OnCheckboxChanged)

回调函数实现为:

void CUserPropertiesDialog::OnCheckboxChanged(NMHDR* pNMHDR, LRESULT* pResult)
{
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*) pNMHDR;
    LVHITTESTINFO hitInfo;

    hitInfo.pt = pNMListView->ptAction;
    int nItem = m_checkBoxList.HitTest(&hitInfo);
    if (hitInfo.flags != LVHT_ONITEMSTATEICON) return;

    std::string groupName = static_cast<LPCTSTR>(m_checkBoxList.GetItemText(nItem, 0));

    if (!CCharmUserAdminGUIApp::getTheCharmUserAdminGUIApp().isAdministrator())
    {
        if (pNMListView->uChanged & LVIF_STATE)
        {
            if (((pNMListView->uNewState & INDEXTOSTATEIMAGEMASK(2)) != 0) && ((pNMListView->uOldState & INDEXTOSTATEIMAGEMASK(1)) != 0))
            {
                CH_INFO1("CUserPropertiesDialog::OnCheckboxChanged - CheckBox Now Selected", groupName);
            }
            else if (((pNMListView->uNewState & INDEXTOSTATEIMAGEMASK(1)) != 0) && ((pNMListView->uOldState & INDEXTOSTATEIMAGEMASK(2)) != 0))
            {
                CH_INFO1("CUserPropertiesDialog::OnCheckboxChanged - CheckBox Now Unselected", groupName);
            }
        }
    }
}

问题是,当用户单击复选框时(好!),以及从代码调用SetChecked()函数时,将调用此函数。

我曾希望hitInfo.flags上的检查能让我分辨出点击和功能,但事实并非如此。

除了在函数调用之前/之后设置一些全局标志并在回调中使用它时,还有其他任何方式来判断是否使用了click或函数调用?

1 个答案:

答案 0 :(得分:0)

我使用相同的inmy程序,我使用了一个标志。

但我使用LVN_ITEMCHANGING。有了这条消息,我可以阻止任何改变。

我覆盖了SetCheck(即使它不是虚拟的)并在我更改列表框项的状态之前设置了一个标志。内部OnItemChanging例程看到标志设置并允许更改。返回后直接清除该标志。

因此,如果使用鼠标执行相同的操作,则不会设置标记,您需要以不同的方式进行检查。

当我加载盒子时也一样。我设置了标志,以便所有更改都可以通过......