MFC: Как изменить цвет / жирность отдельных строк ListCtrl? - PullRequest
6 голосов
/ 11 января 2012

Использование MFC и Visual Studio 2010 C ++. Мне нужен способ выделить некоторые отдельные строки CListCtrl (однако я не хочу использовать встроенную возможность выбора для выделения строк). Это может быть цвет фона строки, вес шрифта или, возможно, даже изображение (если это правильно).

В идеале я хочу знать, как это сделать, используя элемент управления списком акций. Однако, если это невозможно, дайте мне знать, как использовать сторонний код.

UPDATE

Вот код, который я использовал в итоге:

void MyList::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
    NMLVCUSTOMDRAW* cd = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);

    *pResult = CDRF_DODEFAULT;

    switch( cd->nmcd.dwDrawStage)
    {
        case CDDS_PREPAINT:
            *pResult = CDRF_NOTIFYITEMDRAW;
            break;

        case CDDS_ITEMPREPAINT:
            {
                int rowNumber = cd->nmcd.dwItemSpec;
                bool highlightRow = (bool)GetItemData(rowNumber);
                if (highlightRow)
                {
                    COLORREF backgroundColor;
                    backgroundColor = RGB(255, 0, 0);
                    cd->clrTextBk = backgroundColor;
                }
            }
            break;

        default:
            break;
    }
}

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

Ответы [ 3 ]

5 голосов
/ 12 января 2012

Ключевое сообщение здесь - это сообщение NM_CUSTOMDRAW , отправленное вашему CListCtrl (и некоторым другим элементам управления).Это позволяет вам сказать Windows, что вы хотите нарисовать какую-то часть CListCtrl.Идея состоит в том, что сообщение позволяет вам указать, какая часть элемента управления должна быть нарисована пользователем.Поскольку произвольное рисование всего CListCtrl только для изменения цвета текста ячейки будет полностью излишним.

Не беспокойтесь, вам не нужно обрабатывать собственное рисование самостоятельно: сообщение позволяет установить шрифт и/ или цвет текста / спины для одной конкретной строки или ячейки элемента управления.

Эта статья кода проекта , вероятно, является хорошей отправной точкой.

ВотПример более короткого кода для установки цвета конкретной строки в вашем CListCtrl.

0 голосов
/ 26 апреля 2013

Вот что я сделал с моей программой, если строка, которую я хочу выделить, является cin или cout или любым другим, просто поместите этот код выше этой строки

SetConsoleTextAttribute( GetStdHandle(STD_OUTPUT_HANDLE), 0x0F);

последняя часть, то есть 0x0FПозвольте изменить цветовой код фона и текста

после того, как измените его на желаемый цвет, просто вставьте другой ниже строки, которую вы хотите выделить, т.е.

 SetConsoleTextAttribute( GetStdHandle(STD_OUTPUT_HANDLE), 0x0C);

вот таблицацветов и их кодов

    0 = Black       8 = Gray
    1 = Blue        9 = Light Blue
    2 = Green       A = Light Green
    3 = Aqua        B = Light Aqua
    4 = Red         C = Light Red
    5 = Purple      D = Light Purple
    6 = Yellow      E = Light Yellow
    7 = White       F = Bright White

ПРИМЕР для черного фона и синего текста;

SetConsoleTextAttribute( GetStdHandle(STD_OUTPUT_HANDLE), 0x01);
0 голосов
/ 12 января 2012

Вы можете использовать следующий код для изменения цвета фона списка, но я не уверен, что есть поддерживаемые функции для изменения цвета в строке. Ниже приведен код:

YourControl.SetBkColor(RGB(212,208,200));

Надеюсь, это поможет.

...