我只知道用m_list.AddString();添加内容。
7 个解决方案
#1
继承CListBox,自己写DrawItem就可以了
#2
yonk(一无所有) :
能再具体点吗?
能再具体点吗?
#3
自己顶一下
#4
自己重画
#5
那环境设备变量用什么呢?
#6
给你我改写的一个类
ColorListCtrl.h如下
class CColorListCtrl : public CListCtrl
{
DECLARE_DYNAMIC(CColorListCtrl)
protected:
class COBJColor
{
public:
COBJColor(COLORREF TextColor = (COLORREF)0xFF000000, COLORREF BackColor = (COLORREF)0xFF000000);
COLORREF m_TextColor;
COLORREF m_BackColor;
};
class CItemColor : public COBJColor
{
public:
CItemColor();
CItemColor(int nSubItemCount, COLORREF TextColor, COLORREF BackColor);
CItemColor& operator=(const CItemColor& ItemColor);
public:
CArray<COBJColor, COBJColor&> m_SubItemsColor;
};
public:
int InsertColumn(int nCol, const LVCOLUMN* pColumn);
int InsertColumn(int nCol, LPCTSTR pszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1);
BOOL DeleteColumn(int nCol);
int InsertItem(const LVITEM* pItem, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
int InsertItem(int nItem, LPCTSTR pszItem, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
int InsertItem(int nItem, LPCTSTR pszItem, int nImage, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
int InsertItem(UINT nMask, int nItem, LPCTSTR pszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
BOOL DeleteItem(int nItem);
BOOL DeleteAllItems();
BOOL SetItemColor(int nItem, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
BOOL GetItemColor(int nItem, COLORREF* pTextColor, COLORREF* pBackColor);
BOOL SetSubItemColor(int nItem, int nSubItem, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
BOOL GetSubItemColor(int nItem, int nSubItem, COLORREF* pTextColor, COLORREF* pBackColor);
protected:
int GetSubItemCount();
COLORREF GetItemBKColor(int nItem);
private:
CArray<CItemColor, CItemColor&> m_ItemsColor;
protected:
afx_msg void OnCustomdraw(NMHDR* pNMHDR, LRESULT* pResult);
DECLARE_MESSAGE_MAP()
};
ColorListCtrl.h如下
class CColorListCtrl : public CListCtrl
{
DECLARE_DYNAMIC(CColorListCtrl)
protected:
class COBJColor
{
public:
COBJColor(COLORREF TextColor = (COLORREF)0xFF000000, COLORREF BackColor = (COLORREF)0xFF000000);
COLORREF m_TextColor;
COLORREF m_BackColor;
};
class CItemColor : public COBJColor
{
public:
CItemColor();
CItemColor(int nSubItemCount, COLORREF TextColor, COLORREF BackColor);
CItemColor& operator=(const CItemColor& ItemColor);
public:
CArray<COBJColor, COBJColor&> m_SubItemsColor;
};
public:
int InsertColumn(int nCol, const LVCOLUMN* pColumn);
int InsertColumn(int nCol, LPCTSTR pszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1);
BOOL DeleteColumn(int nCol);
int InsertItem(const LVITEM* pItem, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
int InsertItem(int nItem, LPCTSTR pszItem, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
int InsertItem(int nItem, LPCTSTR pszItem, int nImage, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
int InsertItem(UINT nMask, int nItem, LPCTSTR pszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
BOOL DeleteItem(int nItem);
BOOL DeleteAllItems();
BOOL SetItemColor(int nItem, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
BOOL GetItemColor(int nItem, COLORREF* pTextColor, COLORREF* pBackColor);
BOOL SetSubItemColor(int nItem, int nSubItem, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
BOOL GetSubItemColor(int nItem, int nSubItem, COLORREF* pTextColor, COLORREF* pBackColor);
protected:
int GetSubItemCount();
COLORREF GetItemBKColor(int nItem);
private:
CArray<CItemColor, CItemColor&> m_ItemsColor;
protected:
afx_msg void OnCustomdraw(NMHDR* pNMHDR, LRESULT* pResult);
DECLARE_MESSAGE_MAP()
};
#7
ColorListCtrl.cpp如下
#include "ColorListCtrl.h"
IMPLEMENT_DYNAMIC(CColorListCtrl, CListCtrl)
CColorListCtrl::COBJColor::COBJColor(COLORREF TextColor, COLORREF BackColor)
{
m_TextColor = TextColor;
m_BackColor = BackColor;
}
CColorListCtrl::CItemColor::CItemColor()
{
}
CColorListCtrl::CItemColor::CItemColor(int nSubItemCount, COLORREF TextColor, COLORREF BackColor) : COBJColor(TextColor, BackColor)
{
COBJColor SubItemColor;
m_SubItemsColor.SetSize(nSubItemCount);
}
CColorListCtrl::CItemColor& CColorListCtrl::CItemColor::operator=(const CColorListCtrl::CItemColor& ItemColor)
{
if (&ItemColor != this)
{
m_TextColor = ItemColor.m_TextColor;
m_BackColor = ItemColor.m_BackColor;
m_SubItemsColor.RemoveAll();
m_SubItemsColor.Append(ItemColor.m_SubItemsColor);
}
return *this;
}
BEGIN_MESSAGE_MAP(CColorListCtrl, CListCtrl)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomdraw)
END_MESSAGE_MAP()
int CColorListCtrl::InsertColumn(int nCol, const LVCOLUMN* pColumn)
{
if ((nCol = CListCtrl::InsertColumn(nCol, pColumn)) >= 0)
{
for (int nLoop = 0, nItemCount = GetItemCount(); nLoop < nItemCount; nLoop ++)
{
COBJColor SubItemColor;
m_ItemsColor[nLoop].m_SubItemsColor.InsertAt(nCol, SubItemColor);
}
}
return nCol;
}
int CColorListCtrl::InsertColumn(int nCol, LPCTSTR pszColumnHeading, int nFormat, int nWidth, int nSubItem)
{
if ((nCol = CListCtrl::InsertColumn(nCol, pszColumnHeading, nFormat, nWidth, nSubItem)) >= 0)
{
for (int nLoop = 0, nItemCount = GetItemCount(); nLoop < nItemCount; nLoop ++)
{
COBJColor SubItemColor;
m_ItemsColor[nLoop].m_SubItemsColor.InsertAt(nCol, SubItemColor);
}
}
return nCol;
}
BOOL CColorListCtrl::DeleteColumn(int nCol)
{
if (!CListCtrl::DeleteColumn(nCol)) return FALSE;
for(int nLoop = 0, nItemCount = GetItemCount(); nLoop < nItemCount; nLoop ++)
m_ItemsColor[nLoop].m_SubItemsColor.RemoveAt(nCol);
return TRUE;
}
int CColorListCtrl::InsertItem(const LVITEM *pItem, COLORREF TextColor, COLORREF BackColor)
{
int nItem;
if ((nItem = CListCtrl::InsertItem(pItem)) >= 0)
{
CItemColor ItemColor(GetSubItemCount(), TextColor, BackColor);
m_ItemsColor.InsertAt(nItem, ItemColor);
}
return nItem;
}
int CColorListCtrl::InsertItem(int nItem, LPCTSTR pszItem, COLORREF TextColor, COLORREF BackColor)
{
if ((nItem = CListCtrl::InsertItem(nItem, pszItem)) >= 0)
{
CItemColor ItemColor(GetSubItemCount(), TextColor, BackColor);
m_ItemsColor.InsertAt(nItem, ItemColor);
}
return nItem;
}
int CColorListCtrl::InsertItem(int nItem, LPCTSTR pszItem, int nImage, COLORREF TextColor, COLORREF BackColor)
{
if ((nItem = CListCtrl::InsertItem(nItem, pszItem, nImage)) >= 0)
{
CItemColor ItemColor(GetSubItemCount(), TextColor, BackColor);
m_ItemsColor.InsertAt(nItem, ItemColor);
}
return nItem;
}
int CColorListCtrl::InsertItem(UINT nMask, int nItem, LPCTSTR pszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam, COLORREF TextColor, COLORREF BackColor)
{
if ((nItem = CListCtrl::InsertItem(nMask, nItem, pszItem, nState, nStateMask, nImage, lParam)) >= 0)
{
CItemColor ItemColor(GetSubItemCount(), TextColor, BackColor);
m_ItemsColor.InsertAt(nItem, ItemColor);
}
return nItem;
}
BOOL CColorListCtrl::DeleteItem(int nItem)
{
if (!CListCtrl::DeleteItem(nItem)) return FALSE;
m_ItemsColor.RemoveAt(nItem);
return TRUE;
}
BOOL CColorListCtrl::DeleteAllItems()
{
if (!CListCtrl::DeleteAllItems()) return FALSE;
m_ItemsColor.RemoveAll();
return TRUE;
}
BOOL CColorListCtrl::SetItemColor(int nItem, COLORREF TextColor, COLORREF BackColor)
{
if (nItem < 0 || nItem >= GetItemCount()) return FALSE;
m_ItemsColor[nItem].m_TextColor = TextColor;
m_ItemsColor[nItem].m_BackColor = BackColor;
RedrawWindow();
return TRUE;
}
BOOL CColorListCtrl::GetItemColor(int nItem, COLORREF* pTextColor, COLORREF* pBackColor)
{
if (nItem < 0 || nItem >= GetItemCount()) return FALSE;
*pTextColor = m_ItemsColor[nItem].m_TextColor;
*pBackColor = m_ItemsColor[nItem].m_BackColor;
return TRUE;
}
BOOL CColorListCtrl::SetSubItemColor(int nItem, int nSubItem, COLORREF TextColor, COLORREF BackColor)
{
if (nItem < 0 || nItem >= GetItemCount() || nSubItem < 0 || nSubItem >= GetSubItemCount()) return FALSE;
m_ItemsColor[nItem].m_SubItemsColor[nSubItem].m_TextColor = TextColor;
m_ItemsColor[nItem].m_SubItemsColor[nSubItem].m_BackColor = BackColor;
RedrawWindow();
return TRUE;
}
BOOL CColorListCtrl::GetSubItemColor(int nItem, int nSubItem, COLORREF* pTextColor, COLORREF* pBackColor)
{
if (nItem < 0 || nItem >= GetItemCount() || nSubItem < 0 || nSubItem >= GetSubItemCount()) return FALSE;
*pTextColor = m_ItemsColor[nItem].m_SubItemsColor[nSubItem].m_TextColor;
*pBackColor = m_ItemsColor[nItem].m_SubItemsColor[nSubItem].m_BackColor;
return TRUE;
}
int CColorListCtrl::GetSubItemCount()
{
return GetHeaderCtrl()->GetItemCount();
}
COLORREF CColorListCtrl::GetItemBKColor(int nItem)
{
ASSERT(nItem >= 0 && nItem < GetItemCount());
return (m_ItemsColor[nItem].m_BackColor != 0xFF000000 ? m_ItemsColor[nItem].m_BackColor : GetBkColor());
}
void CColorListCtrl::OnCustomdraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVCUSTOMDRAW* pNMLVCUSTOMDRAW = (NMLVCUSTOMDRAW*)pNMHDR;
DWORD_PTR dwItem = pNMLVCUSTOMDRAW->nmcd.dwItemSpec;
switch (pNMLVCUSTOMDRAW->nmcd.dwDrawStage)
{
case CDDS_ITEMPREPAINT:
{
COLORREF TextColor, BackColor;
if ((TextColor = m_ItemsColor[dwItem].m_TextColor) == (COLORREF)0xFF000000) TextColor = GetTextColor();
if ((BackColor = m_ItemsColor[dwItem].m_BackColor) == (COLORREF)0xFF000000) TextColor = GetBkColor();
pNMLVCUSTOMDRAW->clrText = TextColor;
pNMLVCUSTOMDRAW->clrTextBk = BackColor;
break;
}
case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
{
int nSubItem = pNMLVCUSTOMDRAW->iSubItem;
COLORREF TextColor, BackColor;
if ((TextColor = m_ItemsColor[dwItem].m_SubItemsColor[nSubItem].m_TextColor) == (COLORREF)0xFF000000)
if ((TextColor = m_ItemsColor[dwItem].m_TextColor) == (COLORREF)0xFF000000) TextColor = GetTextColor();
if ((BackColor = m_ItemsColor[dwItem].m_SubItemsColor[nSubItem].m_BackColor) == (COLORREF)0xFF000000)
if ((BackColor = m_ItemsColor[dwItem].m_BackColor) == (COLORREF)0xFF000000)
if ((BackColor = GetTextBkColor()) == (COLORREF)0xFF000000) BackColor = GetBkColor();
pNMLVCUSTOMDRAW->clrText = TextColor;
pNMLVCUSTOMDRAW->clrTextBk = BackColor;
break;
}
}
*pResult = CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYSUBITEMDRAW;
}
#include "ColorListCtrl.h"
IMPLEMENT_DYNAMIC(CColorListCtrl, CListCtrl)
CColorListCtrl::COBJColor::COBJColor(COLORREF TextColor, COLORREF BackColor)
{
m_TextColor = TextColor;
m_BackColor = BackColor;
}
CColorListCtrl::CItemColor::CItemColor()
{
}
CColorListCtrl::CItemColor::CItemColor(int nSubItemCount, COLORREF TextColor, COLORREF BackColor) : COBJColor(TextColor, BackColor)
{
COBJColor SubItemColor;
m_SubItemsColor.SetSize(nSubItemCount);
}
CColorListCtrl::CItemColor& CColorListCtrl::CItemColor::operator=(const CColorListCtrl::CItemColor& ItemColor)
{
if (&ItemColor != this)
{
m_TextColor = ItemColor.m_TextColor;
m_BackColor = ItemColor.m_BackColor;
m_SubItemsColor.RemoveAll();
m_SubItemsColor.Append(ItemColor.m_SubItemsColor);
}
return *this;
}
BEGIN_MESSAGE_MAP(CColorListCtrl, CListCtrl)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomdraw)
END_MESSAGE_MAP()
int CColorListCtrl::InsertColumn(int nCol, const LVCOLUMN* pColumn)
{
if ((nCol = CListCtrl::InsertColumn(nCol, pColumn)) >= 0)
{
for (int nLoop = 0, nItemCount = GetItemCount(); nLoop < nItemCount; nLoop ++)
{
COBJColor SubItemColor;
m_ItemsColor[nLoop].m_SubItemsColor.InsertAt(nCol, SubItemColor);
}
}
return nCol;
}
int CColorListCtrl::InsertColumn(int nCol, LPCTSTR pszColumnHeading, int nFormat, int nWidth, int nSubItem)
{
if ((nCol = CListCtrl::InsertColumn(nCol, pszColumnHeading, nFormat, nWidth, nSubItem)) >= 0)
{
for (int nLoop = 0, nItemCount = GetItemCount(); nLoop < nItemCount; nLoop ++)
{
COBJColor SubItemColor;
m_ItemsColor[nLoop].m_SubItemsColor.InsertAt(nCol, SubItemColor);
}
}
return nCol;
}
BOOL CColorListCtrl::DeleteColumn(int nCol)
{
if (!CListCtrl::DeleteColumn(nCol)) return FALSE;
for(int nLoop = 0, nItemCount = GetItemCount(); nLoop < nItemCount; nLoop ++)
m_ItemsColor[nLoop].m_SubItemsColor.RemoveAt(nCol);
return TRUE;
}
int CColorListCtrl::InsertItem(const LVITEM *pItem, COLORREF TextColor, COLORREF BackColor)
{
int nItem;
if ((nItem = CListCtrl::InsertItem(pItem)) >= 0)
{
CItemColor ItemColor(GetSubItemCount(), TextColor, BackColor);
m_ItemsColor.InsertAt(nItem, ItemColor);
}
return nItem;
}
int CColorListCtrl::InsertItem(int nItem, LPCTSTR pszItem, COLORREF TextColor, COLORREF BackColor)
{
if ((nItem = CListCtrl::InsertItem(nItem, pszItem)) >= 0)
{
CItemColor ItemColor(GetSubItemCount(), TextColor, BackColor);
m_ItemsColor.InsertAt(nItem, ItemColor);
}
return nItem;
}
int CColorListCtrl::InsertItem(int nItem, LPCTSTR pszItem, int nImage, COLORREF TextColor, COLORREF BackColor)
{
if ((nItem = CListCtrl::InsertItem(nItem, pszItem, nImage)) >= 0)
{
CItemColor ItemColor(GetSubItemCount(), TextColor, BackColor);
m_ItemsColor.InsertAt(nItem, ItemColor);
}
return nItem;
}
int CColorListCtrl::InsertItem(UINT nMask, int nItem, LPCTSTR pszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam, COLORREF TextColor, COLORREF BackColor)
{
if ((nItem = CListCtrl::InsertItem(nMask, nItem, pszItem, nState, nStateMask, nImage, lParam)) >= 0)
{
CItemColor ItemColor(GetSubItemCount(), TextColor, BackColor);
m_ItemsColor.InsertAt(nItem, ItemColor);
}
return nItem;
}
BOOL CColorListCtrl::DeleteItem(int nItem)
{
if (!CListCtrl::DeleteItem(nItem)) return FALSE;
m_ItemsColor.RemoveAt(nItem);
return TRUE;
}
BOOL CColorListCtrl::DeleteAllItems()
{
if (!CListCtrl::DeleteAllItems()) return FALSE;
m_ItemsColor.RemoveAll();
return TRUE;
}
BOOL CColorListCtrl::SetItemColor(int nItem, COLORREF TextColor, COLORREF BackColor)
{
if (nItem < 0 || nItem >= GetItemCount()) return FALSE;
m_ItemsColor[nItem].m_TextColor = TextColor;
m_ItemsColor[nItem].m_BackColor = BackColor;
RedrawWindow();
return TRUE;
}
BOOL CColorListCtrl::GetItemColor(int nItem, COLORREF* pTextColor, COLORREF* pBackColor)
{
if (nItem < 0 || nItem >= GetItemCount()) return FALSE;
*pTextColor = m_ItemsColor[nItem].m_TextColor;
*pBackColor = m_ItemsColor[nItem].m_BackColor;
return TRUE;
}
BOOL CColorListCtrl::SetSubItemColor(int nItem, int nSubItem, COLORREF TextColor, COLORREF BackColor)
{
if (nItem < 0 || nItem >= GetItemCount() || nSubItem < 0 || nSubItem >= GetSubItemCount()) return FALSE;
m_ItemsColor[nItem].m_SubItemsColor[nSubItem].m_TextColor = TextColor;
m_ItemsColor[nItem].m_SubItemsColor[nSubItem].m_BackColor = BackColor;
RedrawWindow();
return TRUE;
}
BOOL CColorListCtrl::GetSubItemColor(int nItem, int nSubItem, COLORREF* pTextColor, COLORREF* pBackColor)
{
if (nItem < 0 || nItem >= GetItemCount() || nSubItem < 0 || nSubItem >= GetSubItemCount()) return FALSE;
*pTextColor = m_ItemsColor[nItem].m_SubItemsColor[nSubItem].m_TextColor;
*pBackColor = m_ItemsColor[nItem].m_SubItemsColor[nSubItem].m_BackColor;
return TRUE;
}
int CColorListCtrl::GetSubItemCount()
{
return GetHeaderCtrl()->GetItemCount();
}
COLORREF CColorListCtrl::GetItemBKColor(int nItem)
{
ASSERT(nItem >= 0 && nItem < GetItemCount());
return (m_ItemsColor[nItem].m_BackColor != 0xFF000000 ? m_ItemsColor[nItem].m_BackColor : GetBkColor());
}
void CColorListCtrl::OnCustomdraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVCUSTOMDRAW* pNMLVCUSTOMDRAW = (NMLVCUSTOMDRAW*)pNMHDR;
DWORD_PTR dwItem = pNMLVCUSTOMDRAW->nmcd.dwItemSpec;
switch (pNMLVCUSTOMDRAW->nmcd.dwDrawStage)
{
case CDDS_ITEMPREPAINT:
{
COLORREF TextColor, BackColor;
if ((TextColor = m_ItemsColor[dwItem].m_TextColor) == (COLORREF)0xFF000000) TextColor = GetTextColor();
if ((BackColor = m_ItemsColor[dwItem].m_BackColor) == (COLORREF)0xFF000000) TextColor = GetBkColor();
pNMLVCUSTOMDRAW->clrText = TextColor;
pNMLVCUSTOMDRAW->clrTextBk = BackColor;
break;
}
case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
{
int nSubItem = pNMLVCUSTOMDRAW->iSubItem;
COLORREF TextColor, BackColor;
if ((TextColor = m_ItemsColor[dwItem].m_SubItemsColor[nSubItem].m_TextColor) == (COLORREF)0xFF000000)
if ((TextColor = m_ItemsColor[dwItem].m_TextColor) == (COLORREF)0xFF000000) TextColor = GetTextColor();
if ((BackColor = m_ItemsColor[dwItem].m_SubItemsColor[nSubItem].m_BackColor) == (COLORREF)0xFF000000)
if ((BackColor = m_ItemsColor[dwItem].m_BackColor) == (COLORREF)0xFF000000)
if ((BackColor = GetTextBkColor()) == (COLORREF)0xFF000000) BackColor = GetBkColor();
pNMLVCUSTOMDRAW->clrText = TextColor;
pNMLVCUSTOMDRAW->clrTextBk = BackColor;
break;
}
}
*pResult = CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYSUBITEMDRAW;
}
#1
继承CListBox,自己写DrawItem就可以了
#2
yonk(一无所有) :
能再具体点吗?
能再具体点吗?
#3
自己顶一下
#4
自己重画
#5
那环境设备变量用什么呢?
#6
给你我改写的一个类
ColorListCtrl.h如下
class CColorListCtrl : public CListCtrl
{
DECLARE_DYNAMIC(CColorListCtrl)
protected:
class COBJColor
{
public:
COBJColor(COLORREF TextColor = (COLORREF)0xFF000000, COLORREF BackColor = (COLORREF)0xFF000000);
COLORREF m_TextColor;
COLORREF m_BackColor;
};
class CItemColor : public COBJColor
{
public:
CItemColor();
CItemColor(int nSubItemCount, COLORREF TextColor, COLORREF BackColor);
CItemColor& operator=(const CItemColor& ItemColor);
public:
CArray<COBJColor, COBJColor&> m_SubItemsColor;
};
public:
int InsertColumn(int nCol, const LVCOLUMN* pColumn);
int InsertColumn(int nCol, LPCTSTR pszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1);
BOOL DeleteColumn(int nCol);
int InsertItem(const LVITEM* pItem, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
int InsertItem(int nItem, LPCTSTR pszItem, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
int InsertItem(int nItem, LPCTSTR pszItem, int nImage, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
int InsertItem(UINT nMask, int nItem, LPCTSTR pszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
BOOL DeleteItem(int nItem);
BOOL DeleteAllItems();
BOOL SetItemColor(int nItem, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
BOOL GetItemColor(int nItem, COLORREF* pTextColor, COLORREF* pBackColor);
BOOL SetSubItemColor(int nItem, int nSubItem, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
BOOL GetSubItemColor(int nItem, int nSubItem, COLORREF* pTextColor, COLORREF* pBackColor);
protected:
int GetSubItemCount();
COLORREF GetItemBKColor(int nItem);
private:
CArray<CItemColor, CItemColor&> m_ItemsColor;
protected:
afx_msg void OnCustomdraw(NMHDR* pNMHDR, LRESULT* pResult);
DECLARE_MESSAGE_MAP()
};
ColorListCtrl.h如下
class CColorListCtrl : public CListCtrl
{
DECLARE_DYNAMIC(CColorListCtrl)
protected:
class COBJColor
{
public:
COBJColor(COLORREF TextColor = (COLORREF)0xFF000000, COLORREF BackColor = (COLORREF)0xFF000000);
COLORREF m_TextColor;
COLORREF m_BackColor;
};
class CItemColor : public COBJColor
{
public:
CItemColor();
CItemColor(int nSubItemCount, COLORREF TextColor, COLORREF BackColor);
CItemColor& operator=(const CItemColor& ItemColor);
public:
CArray<COBJColor, COBJColor&> m_SubItemsColor;
};
public:
int InsertColumn(int nCol, const LVCOLUMN* pColumn);
int InsertColumn(int nCol, LPCTSTR pszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1);
BOOL DeleteColumn(int nCol);
int InsertItem(const LVITEM* pItem, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
int InsertItem(int nItem, LPCTSTR pszItem, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
int InsertItem(int nItem, LPCTSTR pszItem, int nImage, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
int InsertItem(UINT nMask, int nItem, LPCTSTR pszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
BOOL DeleteItem(int nItem);
BOOL DeleteAllItems();
BOOL SetItemColor(int nItem, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
BOOL GetItemColor(int nItem, COLORREF* pTextColor, COLORREF* pBackColor);
BOOL SetSubItemColor(int nItem, int nSubItem, COLORREF TextColor = 0xFF000000, COLORREF BackColor = 0xFF000000);
BOOL GetSubItemColor(int nItem, int nSubItem, COLORREF* pTextColor, COLORREF* pBackColor);
protected:
int GetSubItemCount();
COLORREF GetItemBKColor(int nItem);
private:
CArray<CItemColor, CItemColor&> m_ItemsColor;
protected:
afx_msg void OnCustomdraw(NMHDR* pNMHDR, LRESULT* pResult);
DECLARE_MESSAGE_MAP()
};
#7
ColorListCtrl.cpp如下
#include "ColorListCtrl.h"
IMPLEMENT_DYNAMIC(CColorListCtrl, CListCtrl)
CColorListCtrl::COBJColor::COBJColor(COLORREF TextColor, COLORREF BackColor)
{
m_TextColor = TextColor;
m_BackColor = BackColor;
}
CColorListCtrl::CItemColor::CItemColor()
{
}
CColorListCtrl::CItemColor::CItemColor(int nSubItemCount, COLORREF TextColor, COLORREF BackColor) : COBJColor(TextColor, BackColor)
{
COBJColor SubItemColor;
m_SubItemsColor.SetSize(nSubItemCount);
}
CColorListCtrl::CItemColor& CColorListCtrl::CItemColor::operator=(const CColorListCtrl::CItemColor& ItemColor)
{
if (&ItemColor != this)
{
m_TextColor = ItemColor.m_TextColor;
m_BackColor = ItemColor.m_BackColor;
m_SubItemsColor.RemoveAll();
m_SubItemsColor.Append(ItemColor.m_SubItemsColor);
}
return *this;
}
BEGIN_MESSAGE_MAP(CColorListCtrl, CListCtrl)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomdraw)
END_MESSAGE_MAP()
int CColorListCtrl::InsertColumn(int nCol, const LVCOLUMN* pColumn)
{
if ((nCol = CListCtrl::InsertColumn(nCol, pColumn)) >= 0)
{
for (int nLoop = 0, nItemCount = GetItemCount(); nLoop < nItemCount; nLoop ++)
{
COBJColor SubItemColor;
m_ItemsColor[nLoop].m_SubItemsColor.InsertAt(nCol, SubItemColor);
}
}
return nCol;
}
int CColorListCtrl::InsertColumn(int nCol, LPCTSTR pszColumnHeading, int nFormat, int nWidth, int nSubItem)
{
if ((nCol = CListCtrl::InsertColumn(nCol, pszColumnHeading, nFormat, nWidth, nSubItem)) >= 0)
{
for (int nLoop = 0, nItemCount = GetItemCount(); nLoop < nItemCount; nLoop ++)
{
COBJColor SubItemColor;
m_ItemsColor[nLoop].m_SubItemsColor.InsertAt(nCol, SubItemColor);
}
}
return nCol;
}
BOOL CColorListCtrl::DeleteColumn(int nCol)
{
if (!CListCtrl::DeleteColumn(nCol)) return FALSE;
for(int nLoop = 0, nItemCount = GetItemCount(); nLoop < nItemCount; nLoop ++)
m_ItemsColor[nLoop].m_SubItemsColor.RemoveAt(nCol);
return TRUE;
}
int CColorListCtrl::InsertItem(const LVITEM *pItem, COLORREF TextColor, COLORREF BackColor)
{
int nItem;
if ((nItem = CListCtrl::InsertItem(pItem)) >= 0)
{
CItemColor ItemColor(GetSubItemCount(), TextColor, BackColor);
m_ItemsColor.InsertAt(nItem, ItemColor);
}
return nItem;
}
int CColorListCtrl::InsertItem(int nItem, LPCTSTR pszItem, COLORREF TextColor, COLORREF BackColor)
{
if ((nItem = CListCtrl::InsertItem(nItem, pszItem)) >= 0)
{
CItemColor ItemColor(GetSubItemCount(), TextColor, BackColor);
m_ItemsColor.InsertAt(nItem, ItemColor);
}
return nItem;
}
int CColorListCtrl::InsertItem(int nItem, LPCTSTR pszItem, int nImage, COLORREF TextColor, COLORREF BackColor)
{
if ((nItem = CListCtrl::InsertItem(nItem, pszItem, nImage)) >= 0)
{
CItemColor ItemColor(GetSubItemCount(), TextColor, BackColor);
m_ItemsColor.InsertAt(nItem, ItemColor);
}
return nItem;
}
int CColorListCtrl::InsertItem(UINT nMask, int nItem, LPCTSTR pszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam, COLORREF TextColor, COLORREF BackColor)
{
if ((nItem = CListCtrl::InsertItem(nMask, nItem, pszItem, nState, nStateMask, nImage, lParam)) >= 0)
{
CItemColor ItemColor(GetSubItemCount(), TextColor, BackColor);
m_ItemsColor.InsertAt(nItem, ItemColor);
}
return nItem;
}
BOOL CColorListCtrl::DeleteItem(int nItem)
{
if (!CListCtrl::DeleteItem(nItem)) return FALSE;
m_ItemsColor.RemoveAt(nItem);
return TRUE;
}
BOOL CColorListCtrl::DeleteAllItems()
{
if (!CListCtrl::DeleteAllItems()) return FALSE;
m_ItemsColor.RemoveAll();
return TRUE;
}
BOOL CColorListCtrl::SetItemColor(int nItem, COLORREF TextColor, COLORREF BackColor)
{
if (nItem < 0 || nItem >= GetItemCount()) return FALSE;
m_ItemsColor[nItem].m_TextColor = TextColor;
m_ItemsColor[nItem].m_BackColor = BackColor;
RedrawWindow();
return TRUE;
}
BOOL CColorListCtrl::GetItemColor(int nItem, COLORREF* pTextColor, COLORREF* pBackColor)
{
if (nItem < 0 || nItem >= GetItemCount()) return FALSE;
*pTextColor = m_ItemsColor[nItem].m_TextColor;
*pBackColor = m_ItemsColor[nItem].m_BackColor;
return TRUE;
}
BOOL CColorListCtrl::SetSubItemColor(int nItem, int nSubItem, COLORREF TextColor, COLORREF BackColor)
{
if (nItem < 0 || nItem >= GetItemCount() || nSubItem < 0 || nSubItem >= GetSubItemCount()) return FALSE;
m_ItemsColor[nItem].m_SubItemsColor[nSubItem].m_TextColor = TextColor;
m_ItemsColor[nItem].m_SubItemsColor[nSubItem].m_BackColor = BackColor;
RedrawWindow();
return TRUE;
}
BOOL CColorListCtrl::GetSubItemColor(int nItem, int nSubItem, COLORREF* pTextColor, COLORREF* pBackColor)
{
if (nItem < 0 || nItem >= GetItemCount() || nSubItem < 0 || nSubItem >= GetSubItemCount()) return FALSE;
*pTextColor = m_ItemsColor[nItem].m_SubItemsColor[nSubItem].m_TextColor;
*pBackColor = m_ItemsColor[nItem].m_SubItemsColor[nSubItem].m_BackColor;
return TRUE;
}
int CColorListCtrl::GetSubItemCount()
{
return GetHeaderCtrl()->GetItemCount();
}
COLORREF CColorListCtrl::GetItemBKColor(int nItem)
{
ASSERT(nItem >= 0 && nItem < GetItemCount());
return (m_ItemsColor[nItem].m_BackColor != 0xFF000000 ? m_ItemsColor[nItem].m_BackColor : GetBkColor());
}
void CColorListCtrl::OnCustomdraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVCUSTOMDRAW* pNMLVCUSTOMDRAW = (NMLVCUSTOMDRAW*)pNMHDR;
DWORD_PTR dwItem = pNMLVCUSTOMDRAW->nmcd.dwItemSpec;
switch (pNMLVCUSTOMDRAW->nmcd.dwDrawStage)
{
case CDDS_ITEMPREPAINT:
{
COLORREF TextColor, BackColor;
if ((TextColor = m_ItemsColor[dwItem].m_TextColor) == (COLORREF)0xFF000000) TextColor = GetTextColor();
if ((BackColor = m_ItemsColor[dwItem].m_BackColor) == (COLORREF)0xFF000000) TextColor = GetBkColor();
pNMLVCUSTOMDRAW->clrText = TextColor;
pNMLVCUSTOMDRAW->clrTextBk = BackColor;
break;
}
case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
{
int nSubItem = pNMLVCUSTOMDRAW->iSubItem;
COLORREF TextColor, BackColor;
if ((TextColor = m_ItemsColor[dwItem].m_SubItemsColor[nSubItem].m_TextColor) == (COLORREF)0xFF000000)
if ((TextColor = m_ItemsColor[dwItem].m_TextColor) == (COLORREF)0xFF000000) TextColor = GetTextColor();
if ((BackColor = m_ItemsColor[dwItem].m_SubItemsColor[nSubItem].m_BackColor) == (COLORREF)0xFF000000)
if ((BackColor = m_ItemsColor[dwItem].m_BackColor) == (COLORREF)0xFF000000)
if ((BackColor = GetTextBkColor()) == (COLORREF)0xFF000000) BackColor = GetBkColor();
pNMLVCUSTOMDRAW->clrText = TextColor;
pNMLVCUSTOMDRAW->clrTextBk = BackColor;
break;
}
}
*pResult = CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYSUBITEMDRAW;
}
#include "ColorListCtrl.h"
IMPLEMENT_DYNAMIC(CColorListCtrl, CListCtrl)
CColorListCtrl::COBJColor::COBJColor(COLORREF TextColor, COLORREF BackColor)
{
m_TextColor = TextColor;
m_BackColor = BackColor;
}
CColorListCtrl::CItemColor::CItemColor()
{
}
CColorListCtrl::CItemColor::CItemColor(int nSubItemCount, COLORREF TextColor, COLORREF BackColor) : COBJColor(TextColor, BackColor)
{
COBJColor SubItemColor;
m_SubItemsColor.SetSize(nSubItemCount);
}
CColorListCtrl::CItemColor& CColorListCtrl::CItemColor::operator=(const CColorListCtrl::CItemColor& ItemColor)
{
if (&ItemColor != this)
{
m_TextColor = ItemColor.m_TextColor;
m_BackColor = ItemColor.m_BackColor;
m_SubItemsColor.RemoveAll();
m_SubItemsColor.Append(ItemColor.m_SubItemsColor);
}
return *this;
}
BEGIN_MESSAGE_MAP(CColorListCtrl, CListCtrl)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomdraw)
END_MESSAGE_MAP()
int CColorListCtrl::InsertColumn(int nCol, const LVCOLUMN* pColumn)
{
if ((nCol = CListCtrl::InsertColumn(nCol, pColumn)) >= 0)
{
for (int nLoop = 0, nItemCount = GetItemCount(); nLoop < nItemCount; nLoop ++)
{
COBJColor SubItemColor;
m_ItemsColor[nLoop].m_SubItemsColor.InsertAt(nCol, SubItemColor);
}
}
return nCol;
}
int CColorListCtrl::InsertColumn(int nCol, LPCTSTR pszColumnHeading, int nFormat, int nWidth, int nSubItem)
{
if ((nCol = CListCtrl::InsertColumn(nCol, pszColumnHeading, nFormat, nWidth, nSubItem)) >= 0)
{
for (int nLoop = 0, nItemCount = GetItemCount(); nLoop < nItemCount; nLoop ++)
{
COBJColor SubItemColor;
m_ItemsColor[nLoop].m_SubItemsColor.InsertAt(nCol, SubItemColor);
}
}
return nCol;
}
BOOL CColorListCtrl::DeleteColumn(int nCol)
{
if (!CListCtrl::DeleteColumn(nCol)) return FALSE;
for(int nLoop = 0, nItemCount = GetItemCount(); nLoop < nItemCount; nLoop ++)
m_ItemsColor[nLoop].m_SubItemsColor.RemoveAt(nCol);
return TRUE;
}
int CColorListCtrl::InsertItem(const LVITEM *pItem, COLORREF TextColor, COLORREF BackColor)
{
int nItem;
if ((nItem = CListCtrl::InsertItem(pItem)) >= 0)
{
CItemColor ItemColor(GetSubItemCount(), TextColor, BackColor);
m_ItemsColor.InsertAt(nItem, ItemColor);
}
return nItem;
}
int CColorListCtrl::InsertItem(int nItem, LPCTSTR pszItem, COLORREF TextColor, COLORREF BackColor)
{
if ((nItem = CListCtrl::InsertItem(nItem, pszItem)) >= 0)
{
CItemColor ItemColor(GetSubItemCount(), TextColor, BackColor);
m_ItemsColor.InsertAt(nItem, ItemColor);
}
return nItem;
}
int CColorListCtrl::InsertItem(int nItem, LPCTSTR pszItem, int nImage, COLORREF TextColor, COLORREF BackColor)
{
if ((nItem = CListCtrl::InsertItem(nItem, pszItem, nImage)) >= 0)
{
CItemColor ItemColor(GetSubItemCount(), TextColor, BackColor);
m_ItemsColor.InsertAt(nItem, ItemColor);
}
return nItem;
}
int CColorListCtrl::InsertItem(UINT nMask, int nItem, LPCTSTR pszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam, COLORREF TextColor, COLORREF BackColor)
{
if ((nItem = CListCtrl::InsertItem(nMask, nItem, pszItem, nState, nStateMask, nImage, lParam)) >= 0)
{
CItemColor ItemColor(GetSubItemCount(), TextColor, BackColor);
m_ItemsColor.InsertAt(nItem, ItemColor);
}
return nItem;
}
BOOL CColorListCtrl::DeleteItem(int nItem)
{
if (!CListCtrl::DeleteItem(nItem)) return FALSE;
m_ItemsColor.RemoveAt(nItem);
return TRUE;
}
BOOL CColorListCtrl::DeleteAllItems()
{
if (!CListCtrl::DeleteAllItems()) return FALSE;
m_ItemsColor.RemoveAll();
return TRUE;
}
BOOL CColorListCtrl::SetItemColor(int nItem, COLORREF TextColor, COLORREF BackColor)
{
if (nItem < 0 || nItem >= GetItemCount()) return FALSE;
m_ItemsColor[nItem].m_TextColor = TextColor;
m_ItemsColor[nItem].m_BackColor = BackColor;
RedrawWindow();
return TRUE;
}
BOOL CColorListCtrl::GetItemColor(int nItem, COLORREF* pTextColor, COLORREF* pBackColor)
{
if (nItem < 0 || nItem >= GetItemCount()) return FALSE;
*pTextColor = m_ItemsColor[nItem].m_TextColor;
*pBackColor = m_ItemsColor[nItem].m_BackColor;
return TRUE;
}
BOOL CColorListCtrl::SetSubItemColor(int nItem, int nSubItem, COLORREF TextColor, COLORREF BackColor)
{
if (nItem < 0 || nItem >= GetItemCount() || nSubItem < 0 || nSubItem >= GetSubItemCount()) return FALSE;
m_ItemsColor[nItem].m_SubItemsColor[nSubItem].m_TextColor = TextColor;
m_ItemsColor[nItem].m_SubItemsColor[nSubItem].m_BackColor = BackColor;
RedrawWindow();
return TRUE;
}
BOOL CColorListCtrl::GetSubItemColor(int nItem, int nSubItem, COLORREF* pTextColor, COLORREF* pBackColor)
{
if (nItem < 0 || nItem >= GetItemCount() || nSubItem < 0 || nSubItem >= GetSubItemCount()) return FALSE;
*pTextColor = m_ItemsColor[nItem].m_SubItemsColor[nSubItem].m_TextColor;
*pBackColor = m_ItemsColor[nItem].m_SubItemsColor[nSubItem].m_BackColor;
return TRUE;
}
int CColorListCtrl::GetSubItemCount()
{
return GetHeaderCtrl()->GetItemCount();
}
COLORREF CColorListCtrl::GetItemBKColor(int nItem)
{
ASSERT(nItem >= 0 && nItem < GetItemCount());
return (m_ItemsColor[nItem].m_BackColor != 0xFF000000 ? m_ItemsColor[nItem].m_BackColor : GetBkColor());
}
void CColorListCtrl::OnCustomdraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVCUSTOMDRAW* pNMLVCUSTOMDRAW = (NMLVCUSTOMDRAW*)pNMHDR;
DWORD_PTR dwItem = pNMLVCUSTOMDRAW->nmcd.dwItemSpec;
switch (pNMLVCUSTOMDRAW->nmcd.dwDrawStage)
{
case CDDS_ITEMPREPAINT:
{
COLORREF TextColor, BackColor;
if ((TextColor = m_ItemsColor[dwItem].m_TextColor) == (COLORREF)0xFF000000) TextColor = GetTextColor();
if ((BackColor = m_ItemsColor[dwItem].m_BackColor) == (COLORREF)0xFF000000) TextColor = GetBkColor();
pNMLVCUSTOMDRAW->clrText = TextColor;
pNMLVCUSTOMDRAW->clrTextBk = BackColor;
break;
}
case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
{
int nSubItem = pNMLVCUSTOMDRAW->iSubItem;
COLORREF TextColor, BackColor;
if ((TextColor = m_ItemsColor[dwItem].m_SubItemsColor[nSubItem].m_TextColor) == (COLORREF)0xFF000000)
if ((TextColor = m_ItemsColor[dwItem].m_TextColor) == (COLORREF)0xFF000000) TextColor = GetTextColor();
if ((BackColor = m_ItemsColor[dwItem].m_SubItemsColor[nSubItem].m_BackColor) == (COLORREF)0xFF000000)
if ((BackColor = m_ItemsColor[dwItem].m_BackColor) == (COLORREF)0xFF000000)
if ((BackColor = GetTextBkColor()) == (COLORREF)0xFF000000) BackColor = GetBkColor();
pNMLVCUSTOMDRAW->clrText = TextColor;
pNMLVCUSTOMDRAW->clrTextBk = BackColor;
break;
}
}
*pResult = CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYSUBITEMDRAW;
}