CListCtrlCl中SetItemColor为什么只能设置一次颜色

shedawei 2017-12-08 11:26:59
网上下的现成代码,在使用过程中发现SetItemColor只能设置一次,为什么不能改变设置过颜色的背景色,有什么办法可以修改吗



//第一次插入数据和设置颜色正确
void CSPLToolView::OnBnClickedButton1()
{
m_ctr_Trace.InsertItem(0, GetCurTimes());
m_ctr_Trace.SetItemText(0, 1, _T("111111"));

m_ctr_Trace.SetItemColor(0, 0, RGB(255, 0, 0));
m_ctr_Trace.SetItemColor(1, 0, RGB(255, 0, 0));
}

//点击另一个按钮改变之前设置的红色背景为绿色失败
void CSPLToolView::OnBnClickedButton3()
{
m_ctr_Trace.SetItemColor(0, 0, RGB(0, 255, 0));
m_ctr_Trace.SetItemColor(1, 0, RGB(0, 255, 0));
}



#include "stdafx.h"
#include "ListCtrlCl.h"


// CListCtrlCl

struct stColor
{
int nRow;
int nCol;
COLORREF rgb;
};
// CListCtrlCl
IMPLEMENT_DYNAMIC(CListCtrlCl, CListCtrl)
CListCtrlCl::CListCtrlCl()
: m_nRowHeight(0)
, m_fontHeight(12)
, m_fontWith(0)
{
m_color = RGB(0,0,0);
}
CListCtrlCl::~CListCtrlCl()
{
stColor *ptemp = NULL;
while (m_ptrListCol.GetCount() > 0)
{
ptemp = (stColor *)(m_ptrListCol.RemoveHead());
if ( NULL != ptemp )
{
delete ptemp;
ptemp = NULL;
}
}
while ( m_ptrListItem.GetCount() > 0)
{
ptemp = (stColor *)(m_ptrListItem.RemoveHead());
if ( NULL != ptemp )
{
delete ptemp;
ptemp = NULL;
}
}
while ( m_colTextColor.GetCount() > 0)
{
ptemp = (stColor *)(m_colTextColor.RemoveHead());
if ( NULL != ptemp )
{
delete ptemp;
ptemp = NULL;
}
}
while ( m_ItemTextColor.GetCount() > 0)
{
ptemp = (stColor *)(m_ItemTextColor.RemoveHead());
if ( NULL != ptemp )
{
delete ptemp;
ptemp = NULL;
}
}
}
BEGIN_MESSAGE_MAP(CListCtrlCl, CListCtrl)
ON_WM_MEASUREITEM_REFLECT()
ON_WM_CREATE()
END_MESSAGE_MAP()
// CListCtrlCl 消息处理程序
void CListCtrlCl::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
ModifyStyle(0,LVS_OWNERDRAWFIXED);
ModifyStyle(0,LVS_REPORT);
CListCtrl::PreSubclassWindow();
CHeaderCtrl *pHeader = GetHeaderCtrl();
m_Header.SubclassWindow(pHeader->GetSafeHwnd());
}
void CListCtrlCl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{

WCHAR lpBuffer[256];
LV_ITEM lvi;
lvi.mask = LVIF_TEXT | LVIF_PARAM;
lvi.iItem = lpDrawItemStruct->itemID;
lvi.iSubItem = 0;
lvi.pszText = lpBuffer;
lvi.cchTextMax = sizeof(lpBuffer);
VERIFY(GetItem(&lvi));
LV_COLUMN lvc, lvcprev;
::ZeroMemory(&lvc, sizeof(lvc));
::ZeroMemory(&lvcprev, sizeof(lvcprev));
lvc.mask = LVCF_WIDTH | LVCF_FMT;
lvcprev.mask = LVCF_WIDTH | LVCF_FMT;
CDC* pDC;
pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rtClient;
GetClientRect(&rtClient);
for (int nCol = 0; GetColumn(nCol, &lvc); nCol++)
{
if (nCol > 0)
{
// Get Previous Column Width in order to move the next display item
GetColumn(nCol - 1, &lvcprev);
lpDrawItemStruct->rcItem.left += lvcprev.cx;
lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left;
}
CRect rcItem;
if (!GetSubItemRect(lpDrawItemStruct->itemID, nCol, LVIR_LABEL, rcItem))
continue;
::ZeroMemory(&lvi, sizeof(lvi));
lvi.iItem = lpDrawItemStruct->itemID;
lvi.mask = LVIF_TEXT | LVIF_PARAM;
lvi.iSubItem = nCol;
lvi.pszText = lpBuffer;
lvi.cchTextMax = sizeof(lpBuffer);
VERIFY(GetItem(&lvi));
CRect rcTemp;
rcTemp = rcItem;
if (nCol == 0)
{
rcTemp.left -= 2;
}
if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
(lpDrawItemStruct->itemState & ODS_SELECTED))
{
//自定义选中颜色
pDC->FillSolidRect(&rcTemp, RGB(125, 125, 125));

pDC->SetTextColor(RGB(255, 0, 0));

/*pDC->FillSolidRect(&rcTemp, GetSysColor(COLOR_HIGHLIGHT)) ;*/
/*pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT)) ;*/
}
else
{
COLORREF color;
color = GetBkColor();
pDC->FillSolidRect(rcTemp, color);
if (FindColColor(nCol, color))
{
pDC->FillSolidRect(rcTemp, color);
}
if (FindItemColor(nCol, lpDrawItemStruct->itemID, color))
{
pDC->FillSolidRect(rcTemp, color);
}
pDC->SetTextColor(m_color);
//---pDC->SetTextColor(RGB(0,0,0)) ;
/* pDC->SetTextColor(RGB(0,255,0))*/;

}
pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));
UINT uFormat = DT_CENTER;
if (m_Header.m_Format[nCol] == '0')
{
uFormat = DT_LEFT;
}
else if (m_Header.m_Format[nCol] == '1')
{
uFormat = DT_CENTER;
}
else if (m_Header.m_Format[nCol] == '2')
{
uFormat = DT_RIGHT;
}
TEXTMETRIC metric;
pDC->GetTextMetrics(&metric);
int ofst;
ofst = rcItem.Height() - metric.tmHeight;
rcItem.OffsetRect(0, ofst / 2);
pDC->SetTextColor(m_color);
//---pDC->SetTextColor(RGB(0,0,0)) ;
COLORREF color;
if (FindColTextColor(nCol, color))
{
// pDC->SetTextColor(color);
}
if (FindItemTextColor(nCol, lpDrawItemStruct->itemID, color))
{
// pDC->SetTextColor(color);
}
CFont nFont, *nOldFont;
nFont.CreateFont(m_fontHeight, m_fontWith, 0, 0, 0, FALSE, FALSE, 0, 0, 0, 0, 0, 0, _TEXT("宋体"));//创建字体
nOldFont = pDC->SelectObject(&nFont);

DrawText(lpDrawItemStruct->hDC, (LPCTSTR)lpBuffer, wcslen(lpBuffer),
&rcItem, uFormat);
pDC->SelectStockObject(SYSTEM_FONT);
}

}
void CListCtrlCl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
if (m_nRowHeight>0)
{
lpMeasureItemStruct->itemHeight = m_nRowHeight;
}
}
int CListCtrlCl::InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat /* = LVCFMT_LEFT */, int nWidth /* = -1 */, int nSubItem /* = -1 */)
{
m_Header.m_HChar.Add(lpszColumnHeading);
if (nFormat==LVCFMT_LEFT)
{
m_Header.m_Format = m_Header.m_Format + _T("0");
}
else if (nFormat==LVCFMT_CENTER)
{
m_Header.m_Format = m_Header.m_Format + _T("1");
}
else if (nFormat==LVCFMT_RIGHT)
{
m_Header.m_Format = m_Header.m_Format + _T("2");
}
else
{
m_Header.m_Format = m_Header.m_Format + _T("1");
}
return CListCtrl::InsertColumn(nCol,lpszColumnHeading,nFormat,nWidth,nSubItem);
}

void CListCtrlCl::SetHeaderBKColor(int R, int G1, int B, int Gradient) //设置表头背景色
{
m_Header.m_R = R;
m_Header.m_G = G1;
m_Header.m_B = B;
m_Header.m_Gradient = Gradient;
}

void CListCtrlCl::SetHeaderHeight(float Height) //设置表头高度
{
m_Header.m_Height = Height;
}
bool CListCtrlCl::FindColColor(int col,COLORREF &color) //查找列颜色
{
int flag = 0;
for (POSITION pos = m_ptrListCol.GetHeadPosition();pos!=NULL;)
{
stColor *pColor = (stColor*)m_ptrListCol.GetNext(pos);
if (pColor->nCol==col)
{
flag = 1;
color = pColor->rgb;
break;
}
}
if (1==flag)
{
return true;
}
return false;
}
bool CListCtrlCl::FindItemColor(int col,int row,COLORREF &color) //查找颜色
{
int flag = 0;
for (POSITION pos = m_ptrListItem.GetHeadPosition();pos!=NULL;)
{
stColor *pColor = (stColor*)m_ptrListItem.GetNext(pos);
if (pColor->nCol==col&&pColor->nRow==row)
{
flag = 1;
color = pColor->rgb;
break;
}
}
if (1==flag)
{
return true;
}
return false;
}
void CListCtrlCl::SetColColor(int col,COLORREF color) //设置列颜色
{
stColor *pColor = new stColor;
pColor->nCol = col;
pColor->rgb = color;
m_ptrListCol.AddTail(pColor);
}
void CListCtrlCl::SetItemColor(int col,int row,COLORREF color) //设置格子颜色
{
stColor *pColor = new stColor;
pColor->nCol = col;
pColor->nRow = row;
pColor->rgb = color;
m_ptrListItem.AddTail(pColor);
}
void CListCtrlCl::SetRowHeight(int nHeight) // 设置行高
{
m_nRowHeight = nHeight;
CRect rcWin;
GetWindowRect(&rcWin);
WINDOWPOS wp;
wp.hwnd = m_hWnd;
wp.cx = rcWin.Width();
wp.cy = rcWin.Height();
wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;
SendMessage(WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp);
}
void CListCtrlCl::SetHeaderFontHW(int nHeight,int nWith) //设置头部字体宽和高
{
m_Header.m_fontHeight = nHeight;
m_Header.m_fontWith = nWith;
}
void CListCtrlCl::SetHeaderTextColor(COLORREF color) //设置头部字体颜色
{
m_Header.m_color = color;
}
void CListCtrlCl::SetTextColor(COLORREF cr) //设置字体颜色
{
m_color = cr;
}
void CListCtrlCl::SetFontHW(int nHeight,int nWith) //设置字体高和宽
{
m_fontHeight = nHeight;
m_fontWith = nWith;
}
void CListCtrlCl::SetColTextColor(int col,COLORREF color)
{
stColor *pColor = new stColor;
pColor->nCol = col;
pColor->rgb = color;
m_colTextColor.AddTail(pColor);
}
bool CListCtrlCl::FindColTextColor(int col,COLORREF &color)
{
int flag = 0;
for (POSITION pos = m_colTextColor.GetHeadPosition();pos!=NULL;)
{
stColor *pColor = (stColor*)m_colTextColor.GetNext(pos);
if (pColor->nCol==col)
{
flag = 1;
color = pColor->rgb;
break;
}
}
if (1==flag)
{
return true;
}
return false;
}
bool CListCtrlCl::FindItemTextColor(int col,int row,COLORREF &color)
{
int flag = 0;
for (POSITION pos = m_ItemTextColor.GetHeadPosition();pos!=NULL;)
{
stColor *pColor = (stColor*)m_ItemTextColor.GetNext(pos);
if (pColor->nCol==col&&pColor->nRow==row)
{
flag = 1;
color = pColor->rgb;
break;
}
}
if (1==flag)
{
return true;
}
return false;
}
void CListCtrlCl::SetItemTextColor(int col,int row,COLORREF color)
{
stColor *pColor = new stColor;
pColor->nCol = col;
pColor->nRow = row;
pColor->rgb = color;
m_ItemTextColor.AddTail(pColor);
}

// CListCtrlCl 消息处理程序

int CListCtrlCl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CListCtrl::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: 在此添加您专用的创建代码
CHeaderCtrl *pHeader = GetHeaderCtrl();
m_Header.SubclassWindow(pHeader->GetSafeHwnd());
return 0;
}

[/code]
...全文
422 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shedawei 2017-12-11
  • 打赏
  • 举报
回复
引用 6 楼 dingxz105090 的回复:
哥们,帮你看了一下代码,注释掉一个break就行了,代码如下:

bool CListCtrlCl::FindItemColor(int col,int row,COLORREF &color) //查找颜色
{
    int flag = 0;
    for (POSITION pos = m_ptrListItem.GetHeadPosition();pos!=NULL;)
    {
        stColor *pColor = (stColor*)m_ptrListItem.GetNext(pos);
        if (pColor->nCol==col&&pColor->nRow==row)
        {
            flag = 1;
            color = pColor->rgb;
//            break;//这里去掉,因为你先后设置了2个颜色,他这里是查找到第一个就立马返回了。去掉这个break后就是以最后一个为准
        }
    }
    if (1==flag)
    {
        return true;
    }
    return false;
}
然后你按钮修改颜色的时候,要这样写:

m_ctr_Trace.SetItemColor(0, 0, RGB(0, 255, 0));
m_ctr_Trace.SetItemColor(1, 0, RGB(0, 255, 0));
m_ctr_Trace.RedrawWindow();//刷新
大牛,非常感谢,问题得以解决,满分赠上,多谢多谢
凌乱哥 2017-12-11
  • 打赏
  • 举报
回复 1
哥们,帮你看了一下代码,注释掉一个break就行了,代码如下:

bool CListCtrlCl::FindItemColor(int col,int row,COLORREF &color) //查找颜色
{
    int flag = 0;
    for (POSITION pos = m_ptrListItem.GetHeadPosition();pos!=NULL;)
    {
        stColor *pColor = (stColor*)m_ptrListItem.GetNext(pos);
        if (pColor->nCol==col&&pColor->nRow==row)
        {
            flag = 1;
            color = pColor->rgb;
//            break;//这里去掉,因为你先后设置了2个颜色,他这里是查找到第一个就立马返回了。去掉这个break后就是以最后一个为准
        }
    }
    if (1==flag)
    {
        return true;
    }
    return false;
}
然后你按钮修改颜色的时候,要这样写:

m_ctr_Trace.SetItemColor(0, 0, RGB(0, 255, 0));
m_ctr_Trace.SetItemColor(1, 0, RGB(0, 255, 0));
m_ctr_Trace.RedrawWindow();//刷新
shedawei 2017-12-08
  • 打赏
  • 举报
回复
感觉像是只要你设置过了某一格颜色,那他永远都是这个颜色了,重新初始化m_ctr_Trace一次也没用,除非程序重启
shedawei 2017-12-08
  • 打赏
  • 举报
回复
引用 2 楼 dingxz105090 的回复:
调用m_ctr_Trace.RedrawWindow()刷新试试看
试过了,还是无效
凌乱哥 2017-12-08
  • 打赏
  • 举报
回复
调用m_ctr_Trace.RedrawWindow()刷新试试看
shedawei 2017-12-08
  • 打赏
  • 举报
回复

// CListCtrlCl
 #include "windows.h"
#include "HeaderCtrlCl.h"
// CListCtrlCl
class CListCtrlCl : public CListCtrl
{
    DECLARE_DYNAMIC(CListCtrlCl)
public:
    CListCtrlCl();
    virtual ~CListCtrlCl();
protected:
    DECLARE_MESSAGE_MAP()
    virtual void PreSubclassWindow();
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
    void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
protected:
    CHeaderCtrlCl m_Header; //表头
    int m_nRowHeight;// 行高
    CPtrList m_ptrListCol;  //保存列颜色
    CPtrList m_ptrListItem; //保存Item颜色表
    CPtrList m_colTextColor; //保存列字体颜色
    CPtrList m_ItemTextColor; //保存单元格字体颜色
    COLORREF m_color;
    int m_fontHeight;	// 字体高度
    int m_fontWith;         // 字体宽度
public:
    // 设置表头高度
   /* void SetHeaderBKColor(int R,int G, int B,int Gradient);*/
    void SetHeaderHeight(float Height);
 /*    void SetHeaderBKColor(int R,int G, int B,int Gradient);*/
    int InsertColumn(int nCol, LPCTSTR lpszColumnHeading,
        int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1);
    void SetHeaderBKColor(int R, int G1, int B, int Gradient);
    void SetHeaderFontHW(int nHeight,int nWith); //设置表头字体大小
    void SetHeaderTextColor(COLORREF color);
    void SetRowHeight(int nHeight); //设置行高
    bool FindColColor(int col ,COLORREF &color); //查找列颜色
    bool FindItemColor(int col,int row,COLORREF &color);
    bool FindColTextColor(int col,COLORREF &color); //查找列字体颜色
    bool FindItemTextColor(int col,int row,COLORREF &color);
    void SetColColor(int col,COLORREF color);  //设置列颜色
    void SetItemColor(int col,int row,COLORREF color); //设置Item颜色
    void SetColTextColor(int col,COLORREF color);   //设置列文本颜色
    void SetItemTextColor(int col,int row,COLORREF color);
    void SetTextColor(COLORREF cr);
    void SetFontHW(int nHeight,int nWith);  //设置字体的高和宽
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
};




shedawei 2017-12-08
  • 打赏
  • 举报
回复
版主帮忙看看啊
可修改颜色的一个CListCtrlCl类 部分函数如下所示 public: 行高 int m nRowHeight; int InsertColumn int nCol LPCTSTR lpszColumnHeading int nFormat LVCFMT LEFT int nWidth 1 int nSubItem 1 ; public: Gradient 渐变系数 立体背景用 不用渐变设为0 void SetHeaderBKColor int R int G int B int Gradient ; public: 设置表头高度 void SetHeaderHeight float Height ; CPtrList m ptrListCol; 保存列颜色 CPtrList m ptrListItem; 保存Item颜色表 CPtrList m colTextColor; 保存列字体颜色 CPtrList m ItemTextColor; 保存单元格字体颜色 bool FindColColor int col COLORREF &color ; 查找列颜色 bool FindItemColor int col int row COLORREF &color ; bool FindColTextColor int col COLORREF &color ; 查找列字体颜色 bool FindItemTextColor int col int row COLORREF &color ; void SetColColor int col COLORREF color ; 设置颜色 void SetItemColor int col int row COLORREF color ; 设置Item颜色 void SetColTextColor int col COLORREF color ; 设置列文本颜色 void SetItemTextColor int col int row COLORREF color ; void SetRowHeigt int nHeight ; 设置行高 void SetHeaderFontHW int nHeight int nWith ; 设置表头字体大小 void SetHeaderTextColor COLORREF color ; COLORREF m color; BOOL SetTextColor COLORREF cr ; void SetFontHW int nHeight int nWith ; 设置字体的高和宽 void EraseItemColor int col int row ; stColor FindItemColor2 int col int row COLORREF &color ; void EraseAllColor ;">可修改颜色的一个CListCtrlCl类 部分函数如下所示 public: 行高 int m nRowHeight; int InsertColumn int nCol LPCTSTR lpszColumnHeading int nFormat LVCFMT LEFT int nWidth 1 int nSubItem 1 ; public: Gradient 渐变系数 立体背景用 不用渐变设为0 [更多]

15,979

社区成员

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

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