MF C CListCtrl - как переместить текст элемента влево - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь реализовать один столбец CListCtrl (или CMFCListCtrl, не имеет значения) таким образом, что некоторые строки могут иметь флажки, а некоторые нет (я не хочу использовать ни CListBox , ни CCheckListBox, потому что в будущем я планирую использовать несколько столбцов). Я использую стиль LVS_EX_CHECKBOXES, но это заставляет каждый элемент иметь флажок. Затем я вручную удаляю флажок с помощью пользовательского обработчика рисования, но у меня возникают проблемы при перемещении текста элемента в левую сторону, чтобы он имел место со стертым флажком.

Так выглядит мой элемент управления списком. например:

enter image description here

Но мне нужно, чтобы это выглядело так (элемент 2 выровнен по левой границе, вместо установленного флажка):

enter image description here

Я создаю свой элемент управления списком динамически, как это:

    list->Create(WS_CHILD | WS_VISIBLE | WS_BORDER | LVS_REPORT | LVS_NOCOLUMNHEADER
                                            rect, this, SOME_ID);
    list->SetExtendedStyle(list->GetExtendedStyle() | LVS_EX_CHECKBOXES);

И моя функция обработчика пользовательского рисования выглядит следующим образом:

Я создаю свой элемент управления списком динамически, как это:

void MyCListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
    *pResult = CDRF_DODEFAULT;
    LPNMLVCUSTOMDRAW lpn = (LPNMLVCUSTOMDRAW)pNMHDR;

    if (CDDS_PREPAINT == lpn->nmcd.dwDrawStage)
    {
        *pResult = CDRF_NOTIFYITEMDRAW; // get notification for every row (item)
    }
    else if (CDDS_ITEMPREPAINT == lpn->nmcd.dwDrawStage)
    {
        int row = lpn->nmcd.dwItemSpec;
        if (row == 1) { // we are in the first row (item2)
            lpn->nmcd.rc.left -= 20; // doesn't do anything
            lpn->rcText.left -= 20; // doesn't do anything

            // this erases checkbox from the current row
            SetItemState(row, INDEXTOSTATEIMAGEMASK(0), LVIS_STATEIMAGEMASK);
        }
    }
}

Есть ли способ достичь желаемого результата? Правильно ли я делаю это, или лучше использовать CListCtrl без LVS_EX_CHECKBOXES и поставить флажки самостоятельно, где я хочу? Если так, то как? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Если бы это был вариант для вас, почему бы вам просто не оставить все как есть? Во всяком случае, первая версия выглядит намного более загроможденной. Вторая версия нарушает наведение глаз.

0 голосов
/ 14 апреля 2020

Вы можете попробовать отступ с минусом (хотя я не пробовал):

LV_ITEM lvItem;
lvItem.iItem = nYourItem;
lvItem.iSubItem = 0;
lvItem.mask = LVIF_INDENT;
lvItem.iIndent = -1;

VERIFY(SetItem(&lvItem));
...