2016-12-16 5 views
1

목록 컨트롤은 리소스에 대해 단일 선택으로 정의됩니다.확인란이있는 CListCtrl

질문 1

CListCtrl의 첫 번째 컬럼의 헤더의 체크 박스를 갖고 싶어. OnInitDialog에 나는 내가 행동과 선택 조치를 확인하는 것은 다른 목적을 위해 사용됩니다 욕망 때문에 확실히하지하는 확장 |LVS_EX_AUTOCHECKSELECT에 추가 할 경우에만 헤더의 체크 박스를 제공

m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT); 

    CString s; 
    s.LoadString(IDS_COLUMN1); 

    #ifndef HDS_CHECKBOXES 
    // Copied from Microsoft SDKs\Windows\v7.0A\Include\CommCtrl.h 
    #define HDS_CHECKBOXES 0x0400 
    #endif 

    CHeaderCtrl& header = *m_list.GetHeaderCtrl(); 
    header.ModifyStyle(0, HDS_CHECKBOXES); 


    #ifndef HDF_CHECKBOX 
    // Copied from Microsoft SDKs\Windows\v7.0A\Include\CommCtrl.h  
    #define HDF_CHECKBOX 0x0040 
    #endif 

    LVCOLUMN lc = { 0 }; 
    lc.mask = LVCF_FMT |LVCF_WIDTH |LVCF_TEXT | LVCF_SUBITEM; 
    lc.fmt |= HDF_CHECKBOX; 
    lc.cx = 96; 
    lc.pszText = (TCHAR*) (LPCTSTR)s; 

    m_list.InsertColumn(0, &lc); 

있습니다. 때 사용자 검사를 수정하거나 항목을 선택하거나 선택 취소로

질문 2

나는 부울 및 마크 일을 설정해야합니다. 그러나 예를 들어 양식로드시 목록을 채울 때와 같이 항목을 삽입 할 때이 작업을 수행하지 않으려면 InsertItemOnItemChanged에 "선택 취소 작업"을 트리거하므로 의도없이 실행됩니다.

는 그것은 m_is_inserting 회원 플래그 모든 조건 삽입 나를 의무 : 실제 사용자 확인을 구별 할 수있는 더 좋은 방법이 있나요

m_is_inserting = true; 
    m_list.InsertItem(i, m_array[i]->GetName()); 
    m_is_inserting = false; 

을하고 LVN_ITEMCHANGED 핸들러

void CMyDialog::OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult) 
{ 
    NMLISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 

    if (pNMListView->uChanged & LVIF_STATE) 
    { 
     if (pNMListView->uNewState & LVIS_SELECTED) 
      OnSelect(); 
     else 
     { 
      if (pNMListView->iItem != -1) 
      { 
       if ((pNMListView->uNewState & LVIS_STATEIMAGEMASK) == 0x1000) 
       { 
        if (!m_is_inserting) 
        { 
         m_array[pNMListView->iItem]->m_active = false; 
         SetModified(); 
        } 
       } 
       else if ((pNMListView->uNewState & LVIS_STATEIMAGEMASK) == 0x2000) 
       { 
        if (!m_is_inserting) 
        { 
         m_array[pNMListView->iItem]->m_active = true; 
         SetModified(); 
        } 
       } 
      } 
     } 
    } 

    *pResult = 0; 
} 

에 따라 반응/InsertItem 부작용에서 조치를 선택 취소 하시겠습니까?

질문 3

체크/선택 해제 상태를 얻기위한 더 나은 상징적 인 규칙이 있습니까? 매직 넘버 0x10000x2000은 꽤 의미가 없습니다!

미리 감사드립니다.

+0

관련 (** 질문 2 **) : http://stackoverflow.com/questions/28582698/differentiate-between-user-click-and-setchecked-in-clistctrl – sergiol

답변

1

먼저 열 머리글을 삽입하십시오. 그런 다음 HDF_CHECKBOX을 변경하십시오. 예를 들어 알림을 처리 할 때

m_list.SetExtendedStyle(LVS_EX_CHECKBOXES| LVS_EX_FULLROWSELECT); 

CHeaderCtrl &header = *m_list.GetHeaderCtrl(); 
header.ModifyStyle(0, HDS_CHECKBOXES); 

m_list.InsertColumn(0, L"Column0", 0, 120, 0); 
m_list.InsertColumn(1, L"Column1", 0, 80, 1); 
m_list.InsertColumn(2, L"Column2", 0, 80, 2); 

HDITEM hdi = { 0 }; 
hdi.mask = HDI_FORMAT; 
header.GetItem(0, &hdi); 
hdi.fmt |= HDF_CHECKBOX; 
header.SetItem(0, &hdi); 

m_list.InsertItem(m_list.GetItemCount(), L"C0", 0); 
m_list.InsertItem(m_list.GetItemCount(), L"C1", 0); 

m_list.SetCheck(0, 1); 
m_list.SetCheck(1, 1); 

당신은 항목이 선택 가능 여부를 확인하기 위해 GetCheck 방법을 사용할 수 있습니다. 예 :

if(pNMListView->uChanged & LVIF_STATE) 
{ 
    if(pNMListView->uNewState & LVIS_SELECTED) 
    { 
     ... 
    } 
    else if(pNMListView->uNewState & LVIS_STATEIMAGEMASK && pNMListView->iItem >= 0) 
    { 
     if(m_list.GetCheck(pNMListView->iItem)) 
      TRACE("%d checked\n", pNMListView->iItem); 
    } 
} 
+0

감사합니다. 당신은 내 질문의 "헤더에 체크 박스를 표시하는 법"부분 (** Question 1 **)을 받았습니다. 아직 알림을 처리하지 않았습니다. 사이드 노트 :'CMFCListCtrl' /'CMFCHeaderCtrlist' 헤더의 체크 박스를 구현하지 않은 것 같습니다.'afxheaderctrl '에서'HDS_CHECKBOXES','HDF_CHECKBOX' 및'HDF_CHECKED'를 찾지 못했기 때문입니다 .cpp | h'와'afxlistctrl.cpp | h' 파일들! – sergiol