【问题标题】:Changing MFC List Control header color更改 MFC 列表控件标题颜色
【发布时间】:2015-04-30 06:12:49
【问题描述】:

我正在寻找在 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);

【问题讨论】:

    标签: c++ colors mfc listcontrol


    【解决方案1】:

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

    • 从 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();
        }
    

    在头类中,

    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;
            }
        }
    

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

    我会留下任何自定义让您完成。

    【讨论】:

    • 实际上,通过使用CMFCListCtrl,后者使用CMFCHeaderCtrl,后者已经允许覆盖函数OnFillBackground。这也许是另一种选择。
    • 在哪里下载示例代码,对 mfc 有基本的了解,很难理解如何派生 CListView 等
    • 我的意思是 CListCtrl
    • @BigChief 如果您在理解类派生方面遇到问题,如果您搜索它,就会有大量可用的文档。否则,搜索所有者绘制的 CListCtrl,或所有者绘制的 CHeaderCtrl。
    • 没关系,我忘了在 CHeaderCtrl 派生类的标题中添加 DECLARE_MESSAGE_MAP(),在派生的 CHeaderCtrl 类 BEGIN_MESSAGE_MAP(MyHeader, CHeaderCtrl) ON_NOTIFY_REFLECT_EX(NM_CUSTOMDRAW, &MyHeader::OnNMCustomdraw) END_MESSAGE_MAP()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 2011-11-01
    • 2017-09-19
    相关资源
    最近更新 更多