大家帮忙:怎样改变ListBox控件中的字体颜色?

时间:2021-02-09 19:30:57
我作了一个聊天的程序,希望将聊天记录用ListBox控件显示出来,同时希望象QQ一样,将对方说的和自己说的通过字体颜色的不同区分开。请问怎么作呢?
  我只知道用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()
};

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

#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()
};

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