2013-04-29 2 views
0

CListCtrl을 LVS_EX_CHECKBOXES 스타일로 사용하고 있습니다. 그리고 적어도 두 개의 체크 박스를 언제든지 확인하도록 설정해야합니다.CListCtrl (LVS_EX_CHECKBOXES 스타일)

어떻게하면됩니까?

답변

4

먼저 당신이 (예를 들어, CMyListCtrl라고도 함) 함정에 쉽게 CListCtrl에서 자신의 클래스를 파생에 의해 이루어집니다 LVN_ITEMCHANGING 통지를 필요로하는 다음과 같은 메시지 맵 항목을 추가하는 다음과 :

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, 또는 거기에 루프를 넣어 각 항목의 점검 상태를 얻고 집계를 만드십시오.

나는 이것이 충분히 움직여야한다고 생각합니다. 그래서 더 이상 붙잡을 수 없다면 질문을 업데이트하십시오.

관련 문제