CListCtrl с флажками вопросов

Элемент управления списком определяется как одиночный выбор ресурсов.

Вопрос 1

Я хочу иметь флажок в заголовке первого столбца моегоCListCtrl, НаOnInitDialog я имею

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

Это только представляет флажок заголовка, если я добавляю в расширенный|LVS_EX_AUTOCHECKSELECTчто я определенно не хочу, потому что я хочу, чтобы действие проверки и выбора было использовано для разных целей.

вопрос 2

Мне нужно установить логическое значение и пометить вещь как измененную, когда пользователь проверяет или снимает отметку с элемента. Но я не хочу, чтобы это действие происходило при вставке элементов, например при заполнении списка при загрузке формы, но оно запускается без моего намерения, какInsertItem вызывает действие «снять галочку» наOnItemChanged.

Это обязало меня подготовить каждую вставку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

Есть ли лучшее символическое соглашение для получения состояния проверки / отмены? Магические числа0x1000 а также0x2000 довольно бессмысленно!

Заранее спасибо.

Ответы на вопрос(1)

Ваш ответ на вопрос