CListCtrl установить стиль шрифта для полужирного

Я хочу изменить шрифт любой ячейки элемента управления CListCtrl на жирный. Может кто-нибудь сказать, как это сделать для CList Ctrl.

Я уже сделал это для CTreeCtrl, как это

pTC->SetItemState(hItemCur, TVIS_BOLD, TVIS_BOLD);

у нас есть что-то подобное для CListCtrl?

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

2 ответа

Решение

Если вы можете использовать CMFCListCtrl (VS2008 SP1 и выше), вы можете извлечь из него класс и переопределить OnGetCellFont. Оттуда вы возвращаете свой жирный шрифт (вы можете создать свой собственный или вернуть AFX_GLOBAL_DATA::fontBold):

HFONT CMyListCtrl::OnGetCellFont( int nRow, int nColumn, DWORD dwData /*= 0*/ )
{
    if (UseBoldFont(/* params */))
    {
        return GetGlobalData()->fontBold;
    }
    return NULL;
}

Если вам нужно придерживаться простого старого CListCtrl, самый простой способ - использовать Custom Draw, где вы можете настроить процесс рисования под свои нужды. Не путайте это с Owner Draw, где вы должны сделать весь рисунок самостоятельно.

Вот статья, объясняющая основы использования Custom Draw с CListCtrl.

Добавлять

ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomdraw)

к вашей карте сообщений.

Теперь вы можете просто изменить элементы, как вы хотите в этой функции. Здесь вы можете изменить выравнивание, шрифт, цвет фона, цвет текста, [...], и вы можете установить элементы для полужирного -> пример. Лучший способ IMO - хранить указатель на структуру, класс или просто флаг в LPARAM элемента (ов) в элементе управления. Эта функция работает как для CListCtrl, так и для CTreeCtrl.
Вот пример с флагами:

enum ColorFlags
{
    F_COLOR_BLACK = 0x1,
    F_COLOR_WHITE = 0x2
    //and more...
};

enum CustomColors
{
    COLOR_BLACK = RGB(0, 0, 0),
    COLOR_WHITE = RGB(255, 255, 255)
};

afx_msg
void CMyListCtrl::OnCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
    NMLVCUSTOMDRAW *pDraw = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
    switch (pDraw->nmcd.dwDrawStage)
    {
        case CDDS_PREPAINT:
            *pResult = CDRF_NOTIFYITEMDRAW; //Do not forget this...
            break;
        case CDDS_ITEMPREPAINT:
        {
            switch (pDraw->nmcd.lItemlParam) //Extract color from flags
            {
                case F_COLOR_BLACK:
                {
                    pDraw->clrText = COLOR_BLACK;
                } break;
                case F_COLOR_WHITE:
                {
                    pDraw->clrText = COLOR_WHITE;
                } break;
                default:
                    break;
            } //switch
        } break;
    } //switch
}
Другие вопросы по тегам