CListCtrl con preguntas de casillas de verificación

El Control de lista se define como Selección única en los recursos.

Pregunta 1

Quiero tener una casilla de verificación en el encabezado de la primera columna de miCListCtrl. Sobre elOnInitDialog yo tengo

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

Solo presenta la casilla de verificación del encabezado si agrego el extendido|LVS_EX_AUTOCHECKSELECT, que definitivamente no quiero porque deseo que la acción de verificación y la acción de selección se usen para diferentes propósitos.

Pregunta 2

Necesito establecer un elemento booleano y marcarlo como modificado cuando el usuario marca o desmarca un elemento. Pero no quiero que ocurra esta acción al insertar elementos, por ejemplo, al completar la lista al cargar el formulario, pero se desencadena sin mi intención, comoInsertItem desencadena "una acción de desmarcar" enOnItemChanged.

Me obligó a acondicionar cada inserto con unm_is_inserting bandera de miembro:

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

y reaccionar en consecuencia en elLVN_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;
}

¿Hay una mejor manera de distinguir una acción real de verificación / desmarcación de usuario de unaInsertItem ¿efecto secundario?

Pregunta 3

¿Existe una mejor convención simbólica para obtener el estado de marcar / desmarcar? Números mágicos0x1000 y0x2000 son bastante sin sentido!

Gracias por adelantado.

Respuestas a la pregunta(1)

Su respuesta a la pregunta