Я пытаюсь реализовать один столбец CListCtrl
(или CMFCListCtrl
, не имеет значения) таким образом, что некоторые строки могут иметь флажки, а некоторые нет (я не хочу использовать ни CListBox , ни CCheckListBox, потому что в будущем я планирую использовать несколько столбцов). Я использую стиль LVS_EX_CHECKBOXES
, но это заставляет каждый элемент иметь флажок. Затем я вручную удаляю флажок с помощью пользовательского обработчика рисования, но у меня возникают проблемы при перемещении текста элемента в левую сторону, чтобы он имел место со стертым флажком.
Так выглядит мой элемент управления списком. например:
Но мне нужно, чтобы это выглядело так (элемент 2 выровнен по левой границе, вместо установленного флажка):
Я создаю свой элемент управления списком динамически, как это:
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
и поставить флажки самостоятельно, где я хочу? Если так, то как? Заранее спасибо.