看了很多这方面的文章;并且改了很多类,都不太成功.
有没有那种只能改变单元格颜色的ClistCtrl,而基本的InsertColumn()函数和InsertItem(),SetItemText()函数不改变的.我找了很多,但都不合适,改造的ClistCtrl也不成功!
有没有那种只能改变单元格颜色的ClistCtrl,而基本的InsertColumn()函数和InsertItem(),SetItemText()函数不改变的.我找了很多,但都不合适,改造的ClistCtrl也不成功!
不太明白楼主的需求
我这个只能用ClistCtrl 控件了,是不是只要改变单元格字体的颜色,就必须自绘列头和添加项.
为了设置单元格颜色,需要添加一个成员变量和成员函数,然后在自绘中实现。编一下的话,50分太少。
//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;
};
//#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);
}
对话框上添加一个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));这个控件比较简单,主要实现“改变单元格颜色”这一个功能。真正要用,还需要添加一些错误处理功能和绘制列表项状态、编辑等等的功能。