关于如何改变ClistCtrl的标题栏的颜色

时间:2023-02-01 08:55:51
 关于如何改变ClistCtrl的标题栏的颜色
在网上找此资料 ,如下 但颜色没变。不知为什么。

 CColorHeaderCtrl   *   p   =   new   CColorHeaderCtrl;   
  p->SubclassWindow(l.GetHeaderCtrl()->GetSafeHwnd()); 




调试时CColorHeaderCtrl::OnCustomDraw 也执行了。





// ColorHeaderCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "../../resource.h"
#include "ColorHeaderCtrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


//---------------------------------------------------------------------------
//
// CColorHeaderCtrl
//
//---------------------------------------------------------------------------


CColorHeaderCtrl::CColorHeaderCtrl()
{
}


CColorHeaderCtrl::~CColorHeaderCtrl()
{
}


BEGIN_MESSAGE_MAP(CColorHeaderCtrl, CHeaderCtrl)
//{{AFX_MSG_MAP(CColorHeaderCtrl)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()


//---------------------------------------------------------------------------
//
// CColorHeaderCtrl message handlers
//
//---------------------------------------------------------------------------


// CColorHeaderCtrl::OnCustomDraw
//
// Handles custom draw
//
void CColorHeaderCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMCUSTOMDRAW* pCD = (NMCUSTOMDRAW*)pNMHDR;
DWORD dwDrawStage,
dwItemSpec;

*pResult = CDRF_DODEFAULT;

dwDrawStage = pCD->dwDrawStage;
dwItemSpec = pCD->dwItemSpec;

if(dwDrawStage == CDDS_PREPAINT)
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if(dwDrawStage == CDDS_ITEMPREPAINT)
{
HDC hDC = pCD->hdc;

SetTextColor(hDC, RGB(255, 255, 255));

if(dwItemSpec)
SetBkColor(hDC, RGB(  0,   0, 255)); // Blue
else
SetBkColor(hDC, RGB(  255,   0, 0)); // Red

*pResult = CDRF_NEWFONT;
}
}


// CColorHeaderCtrl::OnEraseBkgnd
//
// This is where we specify the background color of the header
//
BOOL CColorHeaderCtrl::OnEraseBkgnd(CDC* pDC) 
{
CRect rc;

GetClientRect(&rc);

pDC->FillSolidRect(&rc, RGB(255, 255, 0)); // Yellow
return TRUE;
}

5 个解决方案

#1


你光SetColor什么的有什么用?要绘制啊。

#2


pDC->FillRect(...)

*pResult = CDRF_SKIPDEFAULT;

#3


up

#4


从CListCtrl派生一个类CMyListCtrl   
  再用ClassWizard给ListCtrl生成一个Variable叫m_listctrl吧!   
  包含头文件,#include   "MyListCtrl.h"修改m_listctrl的类型为CMyListCtrl   
  用ClassWizard产生WM_DRAWITEM消息对应的函数   
  void   CMyListCtrl::OnDrawItem(int   nIDCtl,   LPDRAWITEMSTRUCT   lpDrawItemStruct)     
  {   
          //   TODO:   Add   your   message   handler   code   here   and/or   call   default   
          if(lpDrawItemStruct->CtlType   ==   ODT_HEADER)   
          {   
                    HDITEM   hdi;   
                    TCHAR     lpBuffer[256];   
                    CDC   dc;   
                    dc.Attach(lpDrawItemStruct->hDC);   
      
                    hdi.mask   =   HDI_TEXT;   
                    hdi.pszText   =   lpBuffer;   
                    hdi.cchTextMax   =   256;   
                    CHeaderCtrl*   pHdrCtrl=   NULL;   
                    pHdrCtrl=   GetHeaderCtrl();   
      
                    pHdrCtrl->GetItem(lpDrawItemStruct->itemID,   &hdi);   
                      dc.FillSolidRect(&lpDrawItemStruct->rcItem,RGB(0,255,0));   
  COLORREF   crOldColor   =   dc.SetTextColor(RGB(255,0,0));   
  dc.DrawText(lpBuffer,   strlen(lpBuffer),   
                              &lpDrawItemStruct->rcItem,   DT_SINGLELINE|DT_VCENTER|DT_CENTER);   
                    dc.SetTextColor(crOldColor);   
                    dc.Detach();   
                    return   ;   
          }   
    
          CListCtrl::OnDrawItem(nIDCtl,   lpDrawItemStruct);   
  }   
  你可以在这个函数中做任意你想做的事!!!!甚至可以给HeaderCtrl做个背景图   
  在Dialog的OnInitDialog()中加入的代码类似于如下:   
  HD_ITEM   curItem;   
  //   retrieve   embedded   header   control   
  CHeaderCtrl*   pHdrCtrl=   NULL;   
  pHdrCtrl=   m_listctrl.GetHeaderCtrl();   
  //   add   bmaps   to   each   header   item   
  curItem.mask=     HDI_FORMAT   |HDI_TEXT   |HDI_WIDTH;   
  curItem.fmt=     HDF_LEFT   |   HDF_STRING   |   HDF_OWNERDRAW   ;//这一句中一定要有HDF_OWNERDRAW   否则以上所做的工作全都没有用   
  curItem.pszText   =   "adfadsfasdf";   
  curItem.cxy   =   70;   
  curItem.cchTextMax   =   strlen(curItem.pszText);   
  pHdrCtrl->InsertItem(0,   &curItem);   

#5


ListCtrl的标题栏颜色不是在OnCustomDraw这个函数里实现的。

首先你得自己从CHeaderCtrl派生一个自定义的类CMyHeaderCtrl
然后在你的ListCtrl类里定义一个成员变量:
CMyHeaderCtrl   m_wndMyHeader;

在你的ListCtrl类的OnCreate函数里加入如下代码:
m_wndMyHeader.SubclassDlgItem (0, this);

再在你的CMyHeaderCtrl类中重载OnPaint()和OnDrawItem()函数,在里面实现对标题栏的自绘制。

#1


你光SetColor什么的有什么用?要绘制啊。

#2


pDC->FillRect(...)

*pResult = CDRF_SKIPDEFAULT;

#3


up

#4


从CListCtrl派生一个类CMyListCtrl   
  再用ClassWizard给ListCtrl生成一个Variable叫m_listctrl吧!   
  包含头文件,#include   "MyListCtrl.h"修改m_listctrl的类型为CMyListCtrl   
  用ClassWizard产生WM_DRAWITEM消息对应的函数   
  void   CMyListCtrl::OnDrawItem(int   nIDCtl,   LPDRAWITEMSTRUCT   lpDrawItemStruct)     
  {   
          //   TODO:   Add   your   message   handler   code   here   and/or   call   default   
          if(lpDrawItemStruct->CtlType   ==   ODT_HEADER)   
          {   
                    HDITEM   hdi;   
                    TCHAR     lpBuffer[256];   
                    CDC   dc;   
                    dc.Attach(lpDrawItemStruct->hDC);   
      
                    hdi.mask   =   HDI_TEXT;   
                    hdi.pszText   =   lpBuffer;   
                    hdi.cchTextMax   =   256;   
                    CHeaderCtrl*   pHdrCtrl=   NULL;   
                    pHdrCtrl=   GetHeaderCtrl();   
      
                    pHdrCtrl->GetItem(lpDrawItemStruct->itemID,   &hdi);   
                      dc.FillSolidRect(&lpDrawItemStruct->rcItem,RGB(0,255,0));   
  COLORREF   crOldColor   =   dc.SetTextColor(RGB(255,0,0));   
  dc.DrawText(lpBuffer,   strlen(lpBuffer),   
                              &lpDrawItemStruct->rcItem,   DT_SINGLELINE|DT_VCENTER|DT_CENTER);   
                    dc.SetTextColor(crOldColor);   
                    dc.Detach();   
                    return   ;   
          }   
    
          CListCtrl::OnDrawItem(nIDCtl,   lpDrawItemStruct);   
  }   
  你可以在这个函数中做任意你想做的事!!!!甚至可以给HeaderCtrl做个背景图   
  在Dialog的OnInitDialog()中加入的代码类似于如下:   
  HD_ITEM   curItem;   
  //   retrieve   embedded   header   control   
  CHeaderCtrl*   pHdrCtrl=   NULL;   
  pHdrCtrl=   m_listctrl.GetHeaderCtrl();   
  //   add   bmaps   to   each   header   item   
  curItem.mask=     HDI_FORMAT   |HDI_TEXT   |HDI_WIDTH;   
  curItem.fmt=     HDF_LEFT   |   HDF_STRING   |   HDF_OWNERDRAW   ;//这一句中一定要有HDF_OWNERDRAW   否则以上所做的工作全都没有用   
  curItem.pszText   =   "adfadsfasdf";   
  curItem.cxy   =   70;   
  curItem.cchTextMax   =   strlen(curItem.pszText);   
  pHdrCtrl->InsertItem(0,   &curItem);   

#5


ListCtrl的标题栏颜色不是在OnCustomDraw这个函数里实现的。

首先你得自己从CHeaderCtrl派生一个自定义的类CMyHeaderCtrl
然后在你的ListCtrl类里定义一个成员变量:
CMyHeaderCtrl   m_wndMyHeader;

在你的ListCtrl类的OnCreate函数里加入如下代码:
m_wndMyHeader.SubclassDlgItem (0, this);

再在你的CMyHeaderCtrl类中重载OnPaint()和OnDrawItem()函数,在里面实现对标题栏的自绘制。