更改MFC列表控件标题颜色

Kyl*_*son 2 c++ mfc colors listcontrol

我正在寻找最简单的方法来更改MFC C++中"列表控件"标题的标题颜色.我找到了更改单个单元格和行的方法,但无法获得更改标题颜色的工作版本.这是我使用的所有处理标题的代码:

//Initializes the List Control with four columns
m_CListCtrl.InsertColumn(0, _T("Option"), LVCFMT_LEFT, 200);
m_CListCtrl.InsertColumn(1, _T("User"), LVCFMT_LEFT, 60);
m_CListCtrl.InsertColumn(2, _T("Value"), LVCFMT_LEFT, 80);
m_CListCtrl.InsertColumn(3, _T("Description"), LVCFMT_LEFT, 800);
Run Code Online (Sandbox Code Playgroud)

rri*_*wer 5

这可以做到,但不是没有一点额外的编码.你需要做什么:

  • 从CListCtrl派生自己的类.
  • 从CHeaderCtrl派生自己的类.
  • 用您的标准替换标准CListCtrl标头.
  • 使用自定义绘图进行标题控件.

在派生的CListCtrl中,

void MyListCtrl::PreSubclassWindow()
    {
    // TODO: Add your specialized code here and/or call the base class
    CHeaderCtrl* pHeader = NULL;
    pHeader = GetHeaderCtrl();
    if (pHeader != NULL)
        {
        VERIFY(m_HeaderCtrl.SubclassWindow(pHeader->m_hWnd)); // m_HeaderCtrl is the new wrapper object
        }

    CListCtrl::PreSubclassWindow();
    }
Run Code Online (Sandbox Code Playgroud)

在标题类中,

void MyHeader::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
    {
    LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
    // TODO: Add your control notification handler code here
    *pResult = CDRF_DODEFAULT;

    if (pNMCD->dwDrawStage == CDDS_PREPAINT)
        {
        CDC* pDC = CDC::FromHandle(pNMCD->hdc);
        CRect rect(0, 0, 0, 0);
        GetClientRect(&rect);
        pDC->FillSolidRect(&rect, RGB(255, 0, 0));

        *pResult = CDRF_NOTIFYITEMDRAW;
        }
    else if (pNMCD->dwDrawStage == CDDS_ITEMPREPAINT)
        {
        HDITEM hditem;
        TCHAR buffer[MAX_PATH] = { 0 };
        SecureZeroMemory(&hditem, sizeof(HDITEM));
        hditem.mask = HDI_TEXT;
        hditem.pszText = buffer;
        hditem.cchTextMax = MAX_PATH;
        GetItem(pNMCD->dwItemSpec, &hditem);
        CDC* pDC = CDC::FromHandle(pNMCD->hdc);
        pDC->SetTextColor(RGB(0, 0, 0));
        pDC->SetBkColor(RGB(255, 0, 0));
        CString str(buffer);
        pDC->DrawText(str, CRect(pNMCD->rc), DT_VCENTER | DT_LEFT);
        *pResult = CDRF_SKIPDEFAULT;
        }
    }
Run Code Online (Sandbox Code Playgroud)

使用我的示例代码,你应该看到....

红色CListCtrl标头

我将为您完成任何定制.

  • 实际上,通过使用使用“CMFCHeaderCtrl”的“CMFCListCtrl”,后者已经允许覆盖“OnFillBackground”函数。这也许是一个替代方案。 (3认同)