看了很多这方面的文章;并且改了很多类,都不太成功.
   
      有没有那种只能改变单元格颜色的ClistCtrl,而基本的InsertColumn()函数和InsertItem(),SetItemText()函数不改变的.我找了很多,但都不合适,改造的ClistCtrl也不成功!

解决方案 »

  1.   

    只能自画另外改变单元格字体颜色,SetItemText()的话,字体颜色也会改变的.
    不太明白楼主的需求
      

  2.   

    在你InsertItem()或SetItemText()之前SetTextColor()试试
      

  3.   

    http://www.codeproject.com/miscctrl/#Grid+Control
      

  4.   

    to   vcmute(横秋)  
    我这个只能用ClistCtrl 控件了,是不是只要改变单元格字体的颜色,就必须自绘列头和添加项.
      

  5.   

    to   tangjun237(tangjun2371) 这个函数是改变所有的字体颜色了吧,给我要的不太符合
      

  6.   

    所谓自绘,是从CListCtrl继承一个类,当然原来的成员函数都可以用。
    为了设置单元格颜色,需要添加一个成员变量和成员函数,然后在自绘中实现。编一下的话,50分太少。
      

  7.   

    to  Mackz(在相互)你有这样的类吗?我可以在给你单独开分!
      

  8.   

    简单写一下:
    //ColorListCtrl.h
    #pragma once
    #include <afxtempl.h>// CColorListCtrlclass CColorListCtrl : public CListCtrl
    {
    DECLARE_DYNAMIC(CColorListCtrl)public:
    CColorListCtrl();
    virtual ~CColorListCtrl();protected:
    DECLARE_MESSAGE_MAP()
    protected:
    virtual void PreSubclassWindow();
    public:
    virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
    COLORREF SetItemColor(int nRow, int nCol, COLORREF clrItem);
    COLORREF SetItemColor(LVITEM* plvItem = NULL, COLORREF clrItem = RGB(0, 0, 0));
    private:
    CList<COLORREF*, COLORREF*> m_lstItemColor;
    };
      

  9.   

    // ColorListCtrl.cpp : 实现文件
    //#include "stdafx.h"
    #include "DlgTest.h"
    #include "ColorListCtrl.h"
    #include ".\colorlistctrl.h"
    // CColorListCtrlIMPLEMENT_DYNAMIC(CColorListCtrl, CListCtrl)
    CColorListCtrl::CColorListCtrl()
    {
    }CColorListCtrl::~CColorListCtrl()
    {
    POSITION pos = m_lstItemColor.GetHeadPosition();
    while (pos)
    {
    delete []m_lstItemColor.GetNext(pos);
    }
    }
    BEGIN_MESSAGE_MAP(CColorListCtrl, CListCtrl)
    END_MESSAGE_MAP()
    void CColorListCtrl::PreSubclassWindow()
    {
    // TODO: 在此添加专用代码和/或调用基类
    ModifyStyle(0, LVS_OWNERDRAWFIXED | LVS_REPORT, 0); CListCtrl::PreSubclassWindow();
    }void CColorListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDIS)
    {
    // TODO:  添加您的代码以绘制指定项
    CDC *pDC = CDC::FromHandle(lpDIS->hDC);
    int nRows = m_lstItemColor.GetCount();
    COLORREF *clrCol = NULL;
    if (nRows && lpDIS->itemID < nRows)
    {
    clrCol = m_lstItemColor.GetAt(m_lstItemColor.FindIndex(lpDIS->itemID));
    }
    CRect rcItem(lpDIS->rcItem);
    LVCOLUMN lvColumn;
    ZeroMemory(&lvColumn, sizeof(LVCOLUMN));
    lvColumn.mask = LVCF_FMT | LVCF_WIDTH;
    for (int nCol = 0; nCol < GetHeaderCtrl()->GetItemCount(); nCol++)
    {
    if (clrCol)
    pDC->SetTextColor(clrCol[nCol]);
    GetColumn(nCol, &lvColumn);
    UINT uStyle = DT_SINGLELINE | DT_END_ELLIPSIS;
    if (lvColumn.fmt & LVCFMT_LEFT)
    uStyle |= DT_LEFT;
    if (lvColumn.fmt & LVCFMT_RIGHT)
    uStyle |= DT_RIGHT;
    if (lvColumn.fmt & LVCFMT_CENTER)
    uStyle |= DT_CENTER;
    rcItem.right = rcItem.left + lvColumn.cx;
    pDC->DrawText(GetItemText(lpDIS->itemID, nCol), rcItem, uStyle);
    rcItem.left += lvColumn.cx;
    }
    }// CColorListCtrl 消息处理程序
    COLORREF CColorListCtrl::SetItemColor(int nRow, int nCol, COLORREF clrItem)
    {
    int nCols = GetHeaderCtrl()->GetItemCount();
    int nRows = GetItemCount();
    if (nCol >= nCols || nRow >= nRows)
    return COLORREF(-1); for (int i = m_lstItemColor.GetCount(); i < nRow + 1; i++)
    {
    COLORREF *clrCol = new COLORREF[nCols];
    ZeroMemory(clrCol, sizeof(clrCol));
    m_lstItemColor.AddTail(clrCol);
    } for (int i = 0; i < nRows; i++)
    {
    if (i == nRow)
    {
    COLORREF *clrCol = m_lstItemColor.GetAt(m_lstItemColor.FindIndex(nRow));
    COLORREF clrRet = clrCol[nCol];
    clrCol[nCol] = clrItem;
    return clrRet;
    }
    } return COLORREF(-1);
    }
    COLORREF CColorListCtrl::SetItemColor(LVITEM* plvItem, COLORREF clrItem)
    {
    if (!plvItem)
    {
    return COLORREF(0);
    }
    int nRow = plvItem->iItem;
    int nCol = plvItem->iSubItem;
    return SetItemColor(nCol, nRow, clrItem); return COLORREF(-1);
    }
      

  10.   

    使用:
    对话框上添加一个ListCtrl控件,添加控件变量m_ListCtrl,将变量类型改为CColorListCtrl在OnInitDialog()中: m_ListCtrl.InsertColumn(0, _T("Column 1"), 0, 100);
    m_ListCtrl.InsertColumn(1, _T("Column 2"), LVCFMT_CENTER, 100);
    m_ListCtrl.InsertColumn(2, _T("Column 3"), LVCFMT_RIGHT, 100); int nItem = m_ListCtrl.InsertItem(0, _T("Row 1"));
    m_ListCtrl.SetItemColor(nItem, 0, RGB(255, 0, 0));
    m_ListCtrl.SetItemText(nItem, 1, _T("Row 1-2"));
    m_ListCtrl.SetItemColor(nItem, 1, RGB(255, 255, 0));
    m_ListCtrl.SetItemText(nItem, 2, _T("Row 1-3"));
    m_ListCtrl.SetItemColor(nItem, 2, RGB(255, 0, 255));
    nItem = m_ListCtrl.InsertItem(1, _T("Row 2"));
    m_ListCtrl.SetItemColor(nItem, 0, RGB(100, 0, 255));
    m_ListCtrl.SetItemText(nItem, 1, _T("Row 2-2"));
    m_ListCtrl.SetItemColor(nItem, 1, RGB(255, 100, 0));
    m_ListCtrl.SetItemText(nItem, 2, _T("Row 2-3"));
    m_ListCtrl.SetItemColor(nItem, 2, RGB(255, 0, 100));
    nItem = m_ListCtrl.InsertItem(2, _T("Row 3"));
    m_ListCtrl.SetItemText(nItem, 1, _T("Row 3-2"));
    m_ListCtrl.SetItemText(nItem, 2, _T("Row 3-3"));
    //m_ListCtrl.SetItemColor(nItem, 2, RGB(255, 100, 100));这个控件比较简单,主要实现“改变单元格颜色”这一个功能。真正要用,还需要添加一些错误处理功能和绘制列表项状态、编辑等等的功能。