Я использую CListCtrl с использованием стиля LVS_EX_CHECKBOXES. И мне нужно, чтобы по крайней мере два из этих флажков были установлены в любое время.CListCtrl с LVS_EX_CHECKBOXES style
Как я могу это сделать?
Я использую CListCtrl с использованием стиля LVS_EX_CHECKBOXES. И мне нужно, чтобы по крайней мере два из этих флажков были установлены в любое время.CListCtrl с LVS_EX_CHECKBOXES style
Как я могу это сделать?
Прежде всего, необходимо, чтобы заманить в ловушку 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;
}
}
}
условие является псевдо-код, так что вы можете решить, как следить за количеством выборов - может держать счет, добавив код к выше мето d, или поместите туда петлю, чтобы получить состояние проверки каждого элемента и сделать подсчет.
Я думаю, что это должно дать вам достаточно, чтобы двигаться, поэтому, пожалуйста, обновите свой вопрос, если вы застрянете дальше.