我有一个带有复选框的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或函数调用?
答案 0 :(得分:0)
我使用相同的inmy程序,我使用了一个标志。
但我使用LVN_ITEMCHANGING。有了这条消息,我可以阻止任何改变。
我覆盖了SetCheck(即使它不是虚拟的)并在我更改列表框项的状态之前设置了一个标志。内部OnItemChanging例程看到标志设置并允许更改。返回后直接清除该标志。
因此,如果使用鼠标执行相同的操作,则不会设置标记,您需要以不同的方式进行检查。
当我加载盒子时也一样。我设置了标志,以便所有更改都可以通过......