如何改变ListControl报表形式中的Column的文字颜色和背景颜色?
如题,搜了一下大家都说要自画,但不知道如何写。烦请指教,希望能具体点
[解决办法]
http://www.codeproject.com/KB/list/skinlist.aspx
[解决办法]
1.afx_msg void OnCustomdrawList(NMHDR*, LRESULT*);
2.ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomdrawList )
3.void CEditListCtrl::OnCustomdrawList( NMHDR* pNMHDR, LRESULT* pResult )
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
*pResult = 0;
if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
{
int nItem=(int)(pLVCD->nmcd.dwItemSpec);
if(nItem==m_nItem){
//pLVCD->clrText = RGB(255,155,255);
pLVCD->clrTextBk = RGB(255,0,0);
}
*pResult = CDRF_DODEFAULT;
}
}
[解决办法]
可以通过重载CListCtrl和CHeaderCtrl实现
- C/C++ code
/****************************************CMyListCtrl.h****************************************************/#pragma once#include "HeaderCtrlEx.h"// CMyListCtrlclass CMyListCtrl : public CListCtrl{ DECLARE_DYNAMIC(CMyListCtrl)public: CMyListCtrl(); virtual ~CMyListCtrl();protected: DECLARE_MESSAGE_MAP() virtual void PreSubclassWindow();public: CHeaderCtrlEx m_ctrlHeader;};/****************************************CMyListCtrl.h****************************************************//****************************************CMyListCtrl.cpp****************************************************///子类化CHeaderCtrlExvoid CMyListCtrl::PreSubclassWindow(){ // TODO: Add your specialized code here and/or call the base class CListCtrl::PreSubclassWindow(); m_ctrlHeader.SubclassWindow(::GetDlgItem(m_hWnd,0));}/****************************************CMyListCtrl.cpp****************************************************//****************************************CHeaderCtrlEx.h****************************************************/#pragma once// CHeaderCtrlExclass CHeaderCtrlEx : public CHeaderCtrl{ DECLARE_DYNAMIC(CHeaderCtrlEx)public: CHeaderCtrlEx(); virtual ~CHeaderCtrlEx();protected: DECLARE_MESSAGE_MAP()public: virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);};/****************************************CHeaderCtrlEx.h****************************************************//****************************************CHeaderCtrlEx.cpp****************************************************///修改表头背景色和文本颜色void CHeaderCtrlEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){ // TODO: Add your code to draw the specified item ASSERT(lpDrawItemStruct->CtlType == ODT_HEADER); HDITEM hdi; TCHAR lpBuffer[256]; hdi.mask = HDI_TEXT; hdi.pszText = lpBuffer; hdi.cchTextMax = 256; GetItem(lpDrawItemStruct->itemID,&hdi); CDC* pDC; pDC = CDC::FromHandle(lpDrawItemStruct->hDC); pDC->SetTextColor(RGB(0,0,0)); pDC->SetBkColor(RGB(222,213,242)); CBrush brush; brush.CreateSolidBrush(RGB(222,213,242)); CRect rect = lpDrawItemStruct->rcItem; //THIS FONT IS ONLY FOR DRAWING AS LONG AS WE DON'T DO A SetFont(...) CBrush *pOldBrush=pDC->SelectObject(&brush); pDC->FillRect(&rect,&brush); pDC->SelectObject(pOldBrush); pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT)); UINT uFormat = DT_CENTER; //DRAW THE TEXT lpDrawItemStruct->rcItem.top += 6; ::DrawText(lpDrawItemStruct->hDC,lpBuffer,strlen(lpBuffer), &lpDrawItemStruct->rcItem,uFormat); pDC->SelectStockObject(SYSTEM_FONT);}/****************************************CHeaderCtrlEx.cpp****************************************************//****************************************主程序中**************************************************************///头文件中:CMyCtrlList m_ctrlList ; //m_ctrlList为与CListCtrl控件关联的CMyCtrlList变量//主程序初始化函数中://设置表头自绘属性HDITEM hdItem; hdItem.mask = HDI_FORMAT; for(int i=0;i<m_ctrlList.GetHeaderCtrl()->GetItemCount();i++) //m_ctrlList为CMyCtrlList 变量 { m_ctrlList.GetHeaderCtrl()->GetItem(i,&hdItem); hdItem.fmt |= HDF_OWNERDRAW; m_ctrlList.GetHeaderCtrl()->SetItem(i,&hdItem); }/****************************************主程序OnInitDialog函数中**********************************************/
[解决办法]
[解决办法]
变量CMyListCtrl如何与我的ListControl关联呢?
//用向导给ListCtrl添加关联变量CListCtrl m_ctrlList ;
//然后把上面的CListCtrl改为CMyListCtrl即可,注意包含头文件
使用SubclassDlgItem和SubclassWindow的时候都报错
//报什么错?
[解决办法]
http://www.pocketpcdn.com/articles/hdr_color.html
这个范例挺不错,而且提供了子类,可以直接拿到代码中使用