有压力才有动力,经过两个多小时的摸索,饿着肚子干,终于实现了CListCtrl 单元色颜色的随意改变。特备忘如下:
ColorListCtrl .h代码
#pragma once
// CColorListCtrl
class 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;
};
ColorListCtrl.cpp代码:
// ColorListCtrl.cpp : ʵÏÖÎļþ
//
#include "stdafx.h"
#include "listControl.h"
#include "ColorListCtrl.h"
// CColorListCtrl
IMPLEMENT_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 。
m_ListCtrl.SetItemColor(2,2,RGB(255,0,0));
建议:最好新建一个MFC类CColorListCtrl,基类选CListCtrl ,将这两个文件的代码COPY过去。减少不必要的错误调试。
本文介绍了一种实现CListCtrl中单元格颜色自定义的方法。通过创建CColorListCtrl类并重写绘图及消息处理函数,实现了对列表控件中任意单元格颜色的设置。提供了一份详细的代码示例。
247

被折叠的 条评论
为什么被折叠?



