在MFC C ++中更改文本颜色?

时间:2015-05-18 07:06:09

标签: c++ visual-studio-2013 mfc

我想改变LVITEM的颜色? m_szList是CListCtrl。

LVITEM lvItem;

    lvItem.mask = LVIF_TEXT;
    lvItem.iItem = 0;
    lvItem.iSubItem = 0;
    lvItem.pszText = _T("Sandra");
    m_szList.InsertItem(&lvItem);
    m_szList.SetTextColor(RGB(255, 78, 12));

    lvItem.mask = LVIF_TEXT;
    lvItem.iItem = 1;
    lvItem.iSubItem = 0;
    lvItem.pszText = _T("Roger");
    m_szList.InsertItem(&lvItem);

此代码可以更改sandra和roger的颜色。 但我只想将sandra的颜色改为红色。 罗杰默认(黑色)。

1 个答案:

答案 0 :(得分:4)

您可以为此作业使用自定义绘制列表控件。

您可以通过回复NM_CUSTOMDRAW消息来进行控件自定义绘制。这是从控件发送的通知消息。使用MFC,您的函数头看起来像这样:

void CCustomLvView::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)

要添加此处理程序,通常使用CListCtrl(或CListView)的属性列表,如下所示:

enter image description here

那将创建一个像这样的处理程序:

void CCustomLV2View::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) {
    LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);

    *pResult = CDRF_DODEFAULT;
}

[如果记忆服务,它也有一两条评论。]

您需要添加一些代码才能更改文字颜色,此顺序为:

void CCustomLV2View::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) {
    LPNMLVCUSTOMDRAW pNMCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);

    *pResult = CDRF_DODEFAULT;

    switch (pNMCD->nmcd.dwDrawStage) {
        // this tells the control, before any painting begins, that we 
        // want to be notified just before any item in the control is drawn.
        case CDDS_PREPAINT:
            *pResult = CDRF_NOTIFYITEMDRAW;
            break;

        // This will be called before an item is drawn.
        // We check what item is being drawn, and set the text color appropriately
        case CDDS_ITEMPREPAINT:
            if (pNMCD->nmcd.dwItemSpec == 0)
                pNMCD->clrText = RGB(0, 0, 0);
            else
                pNMCD->clrText = RGB(255, 78, 12);
            break;
    }
}

就像现在一样,这会将第一个项目的文本绘制为黑色,并将所有后续项目绘制为红色。 if (pNMCD->nmcd.dwItemSpec == 0)是选择项目的内容,(当然)pNMCD->clrText = RGB...是设置文本颜色的内容。

另请注意,我对其生成的代码进行了相当小的修改,因此我有一个LPNMLVCUSTOMDRAW而不是LPNMCUSTOMDRAW。这样可以访问传递给自定义绘制处理程序的特定于ListView的字段。没有它,我们无法访问我们正在使用的某些(任何?)字段。