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 ответ

Решение

Сначала вставьте заголовки столбцов. Затем измените 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);
    }
}
Другие вопросы по тегам