用SetTextColor只能改变所以输出文本的颜色,我想只改变我所指定的那一列的颜色,其它列不变。问题解决马上结贴!

解决方案 »

  1.   

    如果没人回,可以自己删除另一个帖子,不扣分!我有两个文件,你看懂了自然就会改了1. TreeCtrlEx.h
    /////////////////////////////////////////////////////////////
    //
    // Author: Sami (M.ALSAMSAM), [email protected]
    //
    // Filename: TreeCtrlEx.h
    //
    // http  : www.ittiger.net
    //
    //////////////////////////////////////////////////////////////
    #if !defined(AFX_TREECTRLEX_H__5D969ED4_7DEA_4FB5_8C1D_E12D1CCF0989__INCLUDED_)
    #define AFX_TREECTRLEX_H__5D969ED4_7DEA_4FB5_8C1D_E12D1CCF0989__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000#include <afxtempl.h>//////////////////////////////////////////////////////////////////////
    class CTreeCtrlEx : public CTreeCtrl
    {
    DECLARE_DYNAMIC(CTreeCtrlEx)public:
    CTreeCtrlEx();
    virtual ~CTreeCtrlEx(); void SetItemFont(HTREEITEM, LOGFONT&);
    void SetItemBold(HTREEITEM, BOOL);
    void SetItemColor(HTREEITEM, COLORREF);
    BOOL GetItemFont(HTREEITEM, LOGFONT *);
    BOOL GetItemBold(HTREEITEM);
    COLORREF GetItemColor(HTREEITEM);protected: struct Color_Font {
    COLORREF color;
    LOGFONT  logfont;
    }; CMap <void*, void*, Color_Font, Color_Font&> m_mapColorFont; protected:
    //{{AFX_MSG(CTreeCtrlEx)
    afx_msg void OnPaint();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()};#endif // !defined(AFX_TREECTRLEX_H__5D969ED4_7DEA_4FB5_8C1D_E12D1CCF0989__INCLUDED_)
      

  2.   

    2. TreeCtrlEx.cpp/////////////////////////////////////////////////////////////
    //
    // Author: Sami (M.ALSAMSAM), [email protected]
    //
    // Filename: TreeCtrlEx.cpp
    //
    // http  : www.ittiger.net
    //
    //////////////////////////////////////////////////////////////
    #include "stdafx.h"
    #include "ColorTree.h"
    #include "TreeCtrlEx.h"#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif//////////////////////////////////
    CTreeCtrlEx::CTreeCtrlEx()
    {
    }CTreeCtrlEx::~CTreeCtrlEx()
    {
    }//////////////////////////////////
    IMPLEMENT_DYNAMIC(CTreeCtrlEx, CTreeCtrl)BEGIN_MESSAGE_MAP(CTreeCtrlEx, CTreeCtrl)
    //{{AFX_MSG_MAP(CTreeCtrlEx)
    ON_WM_PAINT()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()//////////////////////////////////////////////////////////////////////
    void CTreeCtrlEx::SetItemFont(HTREEITEM hItem, LOGFONT& logfont)
    {
    Color_Font cf;
    if( !m_mapColorFont.Lookup( hItem, cf ) )
    cf.color = (COLORREF)-1;
    cf.logfont = logfont;
    m_mapColorFont[hItem] = cf;
    }//////////////////////////////////////////////////////////////////////
    void CTreeCtrlEx::SetItemBold(HTREEITEM hItem, BOOL bBold)
    {
    SetItemState(hItem, bBold ? TVIS_BOLD: 0, TVIS_BOLD);
    }//////////////////////////////////////////////////////////////////////
    void CTreeCtrlEx::SetItemColor(HTREEITEM hItem, COLORREF color)
    {
    Color_Font cf;
    if(!m_mapColorFont.Lookup(hItem, cf))
    cf.logfont.lfFaceName[0] = '\0';
    cf.color = color;
    m_mapColorFont[hItem] = cf;
    }//////////////////////////////////////////////////////////////////////
    BOOL CTreeCtrlEx::GetItemFont(HTREEITEM hItem, LOGFONT * plogfont)
    {
    Color_Font cf;
    if(!m_mapColorFont.Lookup(hItem, cf))
    return FALSE;
    if(cf.logfont.lfFaceName[0] == '\0') 
    return FALSE;
    *plogfont = cf.logfont;
    return TRUE;}//////////////////////////////////////////////////////////////////////
    BOOL CTreeCtrlEx::GetItemBold(HTREEITEM hItem)
    {
    return GetItemState(hItem, TVIS_BOLD) & TVIS_BOLD;
    }//////////////////////////////////////////////////////////////////////
    COLORREF CTreeCtrlEx::GetItemColor(HTREEITEM hItem)
    {
    // Returns (COLORREF)-1 if color was not set
    Color_Font cf;
    if(!m_mapColorFont.Lookup(hItem, cf))
    return (COLORREF) - 1;
    return cf.color;}//////////////////////////////////////////////////////////////////////
    void CTreeCtrlEx::OnPaint() 
    {
    CPaintDC dc(this); // Create a memory DC compatible with the paint DC
    CDC memDC;
    memDC.CreateCompatibleDC(&dc); CRect rcClip, rcClient;
    dc.GetClipBox( &rcClip );
    GetClientRect(&rcClient); // Select a compatible bitmap into the memory DC
    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height() );
    memDC.SelectObject( &bitmap );

    // Set clip region to be same as that in paint DC
    CRgn rgn;
    rgn.CreateRectRgnIndirect( &rcClip );
    memDC.SelectClipRgn(&rgn);
    rgn.DeleteObject();

    // First let the control do its default drawing.
    CWnd::DefWindowProc(WM_PAINT, (WPARAM)memDC.m_hDC, 0); HTREEITEM hItem = GetFirstVisibleItem(); int iItemCount = GetVisibleCount() + 1;
    while(hItem && iItemCount--)
    {
    CRect rect; // Do not meddle with selected items or drop highlighted items
    UINT selflag = TVIS_DROPHILITED | TVIS_SELECTED;
    Color_Font cf;

    //if ( !(GetTreeCtrl().GetItemState( hItem, selflag ) & selflag ) 
    // && m_mapColorFont.Lookup( hItem, cf ))

    if ((GetItemState(hItem, selflag) & selflag) 
    && ::GetFocus() == m_hWnd)
    ;
    else if (m_mapColorFont.Lookup(hItem, cf))
    {
    CFont *pFontDC;
    CFont fontDC;
    LOGFONT logfont; if(cf.logfont.lfFaceName[0] != '\0') 
    logfont = cf.logfont;
    else {
    // No font specified, so use window font
    CFont *pFont = GetFont();
    pFont->GetLogFont( &logfont );
    } if(GetItemBold(hItem))
    logfont.lfWeight = 700; fontDC.CreateFontIndirect(&logfont);
    pFontDC = memDC.SelectObject(&fontDC ); if(cf.color != (COLORREF) - 1)
    memDC.SetTextColor(cf.color);
    else
    memDC.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
    CString sItem = GetItemText(hItem); GetItemRect(hItem, &rect, TRUE);
    memDC.SetBkColor( GetSysColor(COLOR_WINDOW));
    memDC.TextOut(rect.left + 2, rect.top + 1, sItem);

    memDC.SelectObject(pFontDC);
    }
    hItem = GetNextVisibleItem(hItem);
    }
    dc.BitBlt(rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(), &memDC, 
    rcClip.left, rcClip.top, SRCCOPY); memDC.DeleteDC();
    }
      

  3.   


    重载DrawItem, 在传入的item 的dc设置颜色.或者用custom draw.作起来不是一两个语句的, www.codeguru.com 有例子, 自己找.
      

  4.   

    回复人: enoloo(在水一方) ( ) 信誉:102 
    不错。好像是 XP style 的 ListCtrl
      

  5.   

    看一下codeproject上的XListCtrl例子,写的非常清楚
      

  6.   

    http://www.codeproject.com/listctrl/lvcustomdraw.asp
    主要响应自绘事件
      

  7.   

    怎样让ListCtrl的颜色相间原文地址:http://hao.kjz.cn/xml/04080207071562.xml  看到上图的ListView没有?怎样才能使列表控件每一行的颜色都不相同?其实是通过处理NM_CUSTOMDRAW,可以实现这个的功能!但是NM_CUSTOMDRAW在Class Wizard中有可能看不到啊!?不用管它,直接按照下面的方法添加处理过程即可!1. 在消息映射表中加入如下代码BEGIN_MESSAGE_MAP(CIHISSERVERView, CListView)
    //……
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
    //……
    END_MESSAGE_MAP()
    2.在.h头文件中加入:  afx_msg void OnCustomDraw(NMHDR*, LRESULT*);
    3.在.cpp文件中重载NM_CUSTOMDRAW:void CMyView::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
    {
          // TODO: 在此添加消息处理程序代码
          // Contains information specific to an NM_CUSTOMDRAW 
          // notification message sent by a list-view control.
          // mean:draw each item.set txt color,bkcolor....
          NMLVCUSTOMDRAW* pLVCD = (NMLVCUSTOMDRAW*)(pNMHDR);      // Take the default processing unless we set this to something else below.
          *pResult = CDRF_NEWFONT;      // First thing - check the draw stage. If it's the control's prepaint
          // stage, then tell Windows we want messages for every item.
          if ( pLVCD->nmcd.dwDrawStage==CDDS_PREPAINT)
          {
                *pResult = CDRF_NOTIFYITEMDRAW;
          }
          // This is the notification message for an item.  We'll request
          // notifications before each subitem's prepaint stage.      
          else if ( pLVCD->nmcd.dwDrawStage==CDDS_ITEMPREPAINT ) 
          {            
                COLORREF   m_crTextBk , m_clrText;
                int nItem = static_cast<int> (pLVCD->nmcd.dwItemSpec);
                
                CListCtrl &m_list = GetListCtrl();
                CString str1 = m_list.GetItemText(nItem ,15);
          
                bool bDBImplFail = false ;
                if (pLVCD->nmcd.dwItemSpec%2==0)
                {
                      m_crTextBk = RGB(253,241,249) ;
                      m_clrText  = RGB(0,0,0) ;
                }
                else
                {
                      m_crTextBk =  RGB(51,153,255);
                      m_clrText  =  RGB(0,0,0);
                }
                
                pLVCD->clrTextBk = m_crTextBk;
                pLVCD->clrText = m_clrText;
                *pResult = CDRF_DODEFAULT;            
          }      
    }
      

  8.   

    怎样让ListCtrl的颜色相间原文地址:http://hao.kjz.cn/xml/04080207071562.xml  看到上图的ListView没有?怎样才能使列表控件每一行的颜色都不相同?其实是通过处理NM_CUSTOMDRAW,可以实现这个的功能!但是NM_CUSTOMDRAW在Class Wizard中有可能看不到啊!?不用管它,直接按照下面的方法添加处理过程即可!1. 在消息映射表中加入如下代码BEGIN_MESSAGE_MAP(CIHISSERVERView, CListView)
    //……
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
    //……
    END_MESSAGE_MAP()
    2.在.h头文件中加入:  afx_msg void OnCustomDraw(NMHDR*, LRESULT*);
    3.在.cpp文件中重载NM_CUSTOMDRAW:void CMyView::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
    {
          // TODO: 在此添加消息处理程序代码
          // Contains information specific to an NM_CUSTOMDRAW 
          // notification message sent by a list-view control.
          // mean:draw each item.set txt color,bkcolor....
          NMLVCUSTOMDRAW* pLVCD = (NMLVCUSTOMDRAW*)(pNMHDR);      // Take the default processing unless we set this to something else below.
          *pResult = CDRF_NEWFONT;      // First thing - check the draw stage. If it's the control's prepaint
          // stage, then tell Windows we want messages for every item.
          if ( pLVCD->nmcd.dwDrawStage==CDDS_PREPAINT)
          {
                *pResult = CDRF_NOTIFYITEMDRAW;
          }
          // This is the notification message for an item.  We'll request
          // notifications before each subitem's prepaint stage.      
          else if ( pLVCD->nmcd.dwDrawStage==CDDS_ITEMPREPAINT ) 
          {            
                COLORREF   m_crTextBk , m_clrText;
                int nItem = static_cast<int> (pLVCD->nmcd.dwItemSpec);
                
                CListCtrl &m_list = GetListCtrl();
                CString str1 = m_list.GetItemText(nItem ,15);
          
                bool bDBImplFail = false ;
                if (pLVCD->nmcd.dwItemSpec%2==0)
                {
                      m_crTextBk = RGB(253,241,249) ;
                      m_clrText  = RGB(0,0,0) ;
                }
                else
                {
                      m_crTextBk =  RGB(51,153,255);
                      m_clrText  =  RGB(0,0,0);
                }
                
                pLVCD->clrTextBk = m_crTextBk;
                pLVCD->clrText = m_clrText;
                *pResult = CDRF_DODEFAULT;            
          }      
    }
      

  9.   

    //test6dlg.h
    afx_msg void OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult );//testdlg.cpp
    BEGIN_MESSAGE_MAP(CTest6Dlg, CDialog)
    //{{AFX_MSG_MAP(CTest6Dlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_NOTIFY ( NM_CUSTOMDRAW, IDC_LISTCTRL, OnCustomdrawMyList )
    END_MESSAGE_MAP()void CTest6Dlg::OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult )
    {
    NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );

    *pResult = CDRF_DODEFAULT; 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 )
    {
    COLORREF clrNewTextColor, clrNewBkColor;
    int nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );

    if( (m_nSubItem == pLVCD->iSubItem))
    {
    clrNewTextColor = RGB(255,0,0);
    clrNewBkColor = RGB(255,255,0);
    }
    else
    {
    clrNewTextColor = RGB(0,0,0);
    clrNewBkColor = RGB(255,255,255);
    }

    pLVCD->clrText = clrNewTextColor;
    pLVCD->clrTextBk = clrNewBkColor;

    *pResult = CDRF_DODEFAULT;    
    }
    }m_nSubItem就是需要改变的行请在找到你需要改变的l列后调用
    m_List.RedrawItems(0, m_List.GetItemCount());
      

  10.   

    我发现手头有个coloredlistctrl工程。运行后列表框可以随意设置任何一格或者一列或者一行的颜色,要不?