2013-04-29 3 views
0

Я использую CListCtrl с использованием стиля LVS_EX_CHECKBOXES. И мне нужно, чтобы по крайней мере два из этих флажков были установлены в любое время.CListCtrl с LVS_EX_CHECKBOXES style

Как я могу это сделать?

ответ

4

Прежде всего, необходимо, чтобы заманить в ловушку 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, или поместите туда петлю, чтобы получить состояние проверки каждого элемента и сделать подсчет.

Я думаю, что это должно дать вам достаточно, чтобы двигаться, поэтому, пожалуйста, обновите свой вопрос, если вы застрянете дальше.