在网上找此资料 ,如下 但颜色没变。不知为什么。
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;
*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);
再用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()函数,在里面实现对标题栏的自绘制。
首先你得自己从CHeaderCtrl派生一个自定义的类CMyHeaderCtrl
然后在你的ListCtrl类里定义一个成员变量:
CMyHeaderCtrl m_wndMyHeader;
在你的ListCtrl类的OnCreate函数里加入如下代码:
m_wndMyHeader.SubclassDlgItem (0, this);
再在你的CMyHeaderCtrl类中重载OnPaint()和OnDrawItem()函数,在里面实现对标题栏的自绘制。
#1
你光SetColor什么的有什么用?要绘制啊。
#2
pDC->FillRect(...)
*pResult = CDRF_SKIPDEFAULT;
*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);
再用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()函数,在里面实现对标题栏的自绘制。
首先你得自己从CHeaderCtrl派生一个自定义的类CMyHeaderCtrl
然后在你的ListCtrl类里定义一个成员变量:
CMyHeaderCtrl m_wndMyHeader;
在你的ListCtrl类的OnCreate函数里加入如下代码:
m_wndMyHeader.SubclassDlgItem (0, this);
再在你的CMyHeaderCtrl类中重载OnPaint()和OnDrawItem()函数,在里面实现对标题栏的自绘制。