设置ClistCtrl 单元格颜色

liuduofu 2005-12-15 03:58:27
看了很多这方面的文章;并且改了很多类,都不太成功.

有没有那种只能改变单元格颜色的ClistCtrl,而基本的InsertColumn()函数和InsertItem(),SetItemText()函数不改变的.我找了很多,但都不合适,改造的ClistCtrl也不成功!
...全文
1105 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuduofu 2005-12-16
  • 打赏
  • 举报
回复
to Mackz(在相互)

你有这样的类吗?我可以在给你单独开分!
菜牛 2005-12-16
  • 打赏
  • 举报
回复
所谓自绘,是从CListCtrl继承一个类,当然原来的成员函数都可以用。
为了设置单元格颜色,需要添加一个成员变量和成员函数,然后在自绘中实现。编一下的话,50分太少。
liuduofu 2005-12-16
  • 打赏
  • 举报
回复
to tangjun237(tangjun2371)

这个函数是改变所有的字体颜色了吧,给我要的不太符合
liuduofu 2005-12-16
  • 打赏
  • 举报
回复
to vcmute(横秋)
我这个只能用ClistCtrl 控件了,是不是只要改变单元格字体的颜色,就必须自绘列头和添加项.
菜牛 2005-12-16
  • 打赏
  • 举报
回复
使用:
对话框上添加一个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));

这个控件比较简单,主要实现“改变单元格颜色”这一个功能。真正要用,还需要添加一些错误处理功能和绘制列表项状态、编辑等等的功能。
菜牛 2005-12-16
  • 打赏
  • 举报
回复
// ColorListCtrl.cpp : 实现文件
//

#include "stdafx.h"
#include "DlgTest.h"
#include "ColorListCtrl.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);
}
菜牛 2005-12-16
  • 打赏
  • 举报
回复
简单写一下:
//ColorListCtrl.h
#pragma once
#include <afxtempl.h>

// 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;
};


vcmute 2005-12-15
  • 打赏
  • 举报
回复
http://www.codeproject.com/miscctrl/#Grid+Control
tangjun237 2005-12-15
  • 打赏
  • 举报
回复
在你InsertItem()或SetItemText()之前SetTextColor()试试
liuduofu 2005-12-15
  • 打赏
  • 举报
回复
我是只改变一个单元格字体的颜色,,而不是全部.如果自画,那些基本的函数都不能用了吗??
duyhui 2005-12-15
  • 打赏
  • 举报
回复
只能自画

另外改变单元格字体颜色,SetItemText()的话,字体颜色也会改变的.
不太明白楼主的需求
liuduofu 2005-12-15
  • 打赏
  • 举报
回复
是单元格字体颜色!!!!!!!!!!!!!

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧