我正在使用具有 LVS_EX_CHECKBOXES 样式的 CListCtrl。而且我需要随时检查至少两个复选框。
我怎样才能做到这一点?
我正在使用具有 LVS_EX_CHECKBOXES 样式的 CListCtrl。而且我需要随时检查至少两个复选框。
我怎样才能做到这一点?
首先,您需要捕获LVN_ITEMCHANGING
通知,这很容易通过从CListCtrl
(例如,称为CMyListCtrl
)派生您自己的类,然后添加如下所示的消息映射条目来完成:
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
ON_NOTIFY_REFLECT(LVN_ITEMCHANGING, &CMyListCtrl::OnLvnItemchanging)
END_MESSAGE_MAP()
然后,您像这样编写消息处理程序:
void CMyListCtrl::OnLvnItemchanging(NMHDR *pNMHDR, LRESULT *pResult)
{
// an item has changed
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// by default, allow change
*pResult = 0;
// see if item was checked or unchecked
if ((pNMLV->uNewState & 0x2000) == 0x2000)
{
// item was checked - do anything you like here
}
else if ((pNMLV->uNewState & 0x1000) == 0x1000)
{
// item was unchecked - see how many selections we have
if (/* pseudocode */ number of selected items < 2)
{
// disallow change
*pResult = 1;
}
}
}
条件是伪代码,因此您可以决定如何跟踪选择的数量 - 可以通过向上述方法添加代码来保持计数,或者在其中放置一个循环以获取每个项目的检查状态并进行计数.
我认为这应该足以让您继续前进,所以如果您进一步陷入困境,请更新您的问题。