Perguntas sobre CListCtrl com caixas de seleção

O controle de lista é definido como seleção única nos recursos.

Questão 1

Quero ter uma caixa de seleção no cabeçalho da primeira coluna da minhaCListCtrl. NoOnInitDialog eu tenho

    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);

Ele só apresenta a caixa de seleção do cabeçalho se eu adicionar o|LVS_EX_AUTOCHECKSELECT, que definitivamente não quero, porque desejo que a ação de verificação e ação de seleção seja usada para diferentes propósitos.

Questão 2

Preciso definir um valor booleano e marcar como modificado quando o usuário marcar ou desmarcar um item. Mas não quero que essa ação ocorra ao inserir itens, por exemplo, ao preencher a lista no carregamento do formulário, mas é acionada sem a minha intenção, comoInsertItem aciona "uma ação desmarcar" emOnItemChanged.

Obrigou-me a condicionar cada inserto com umm_is_inserting bandeira do membro:

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

e reagir de acordo com aLVN_ITEMCHANGED manipulador

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;
}

Existe uma maneira melhor de distinguir uma ação real de verificação / desmarcação do usuário de umaInsertItem efeito colateral?

Questão 3

Existe uma convenção simbólica melhor para obter o estado de marcar / desmarcar? Números mágicos0x1000 e0x2000 são bem sem sentido!

Desde já, obrigado.

questionAnswers(1)

yourAnswerToTheQuestion