最近在做一个MFC小工具时,需要将一些信息显示在listbox上,正确信息按照默认格式显示,错误信息则显示红色字体。由于对MFC不熟,网上找了些资料最终才达到了目的
在此过程中,本人经历的一些过程,现总结如下(望大牛指正):
1、采用HBRUSH 和 OnCtlColor实现,结果:只能将所有项的字体设置为某种颜色,不能将单独某行设置成独立的颜色,未能达到目的。
实现方式:
1> 在对话框中定义 HBRUSH m_hBrush
2>在函数OnInitDialog中添加
m_hBrush=CreateSolidBrush(RGB(255,255,255))
3>建立映射 ON_WM_CTLCOLOR(),在OnCtlColor中实现代码
HBRUSH CDataDefendDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if(nCtlColor==CTLCOLOR_LISTBOX)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,0,0));
return m_hBrush;
}
return CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
}
2、采用 控件自绘 。控件自绘本人了解两种方式,Owner Draw和NM_CUSTOMDRAW
采用第一种方式成功达到目的,第二种方式未试。
实现方式如下:
1> 写一个类CListBoxSon继承CListBox,子类中重写DrawItem函数
2> 在对话框类的头文件中定义
最近在做一个MFC小工具时,需要将一些信息显示在listbox上,正确信息按照默认格式显示,错误信息则显示红色字体。由于对MFC不熟,网上找了些资料最终才达到了目的
在此过程中,本人经历的一些过程,现总结如下(望大牛指正):
1、采用HBRUSH 和 OnCtlColor实现,结果:只能将所有项的字体设置为某种颜色,不能将单独某行设置成独立的颜色,未能达到目的。
实现方式:
1> 在对话框中定义 HBRUSH m_h
2>在函数OnInitDialog中添加
m_hBrush=CreateSolidBrush(RGB(255,255,255))
3>建立映射 ON_WM_CTLCOLOR(),在OnCtlColor中实现代码
HBRUSH CDataDefendDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if(nCtlColor==CTLCOLOR_LISTBOX)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,0,0));
return m_hBrush;
}
return CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
}
2、采用 控件自绘 。控件自绘本人了解两种方式,Owner Draw和NM_CUSTOMDRAW
采用第一种方式成功达到目的,第二种方式未试。
实现方式如下:
1> 写一个类CListBoxSon继承CListBox,重写DrawItem函数
2> 在对话框类的头文件中定义CListBoxSon m_sonListBox;然后将m_sonListBox与列表框绑定: DDX_Control(pDX, IDC_ListBox,m_sonListBox);
3> 实现DrawItem
void CColorListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
COLORREF crOldTextColor = pDC->GetTextColor();
COLORREF crOldBkColor = pDC->GetBkColor();
COLORREF crRedText = RGB(255,0,0);
COLORREF crBlackText=RGB(0,0,0);
COLORREF crBack = RGB(255,255,255);
CFont font;
LOGFONT log;
GetObject(::GetStockObject(DEFAULT_GUI_FONT),sizeof(log),&log);
//log.lfHeight=25; //字体高度
//log.lfWidth=10; //字体宽度
//log.lfWeight = 500; //字体粗度
//log.lfCharSet=GB2312_CHARSET;
//lstrcpy(log.lfFaceName,"黑体");
font.CreateFontIndirect(&log);
pDC->SelectObject(&font); //启用新字体
//pDC->SetTextColor(crBlackText);
pDC->SetBkColor(crBack);
//如果选项处于选中状态,用下面的字体和颜色
//if( (lpDrawItemStruct->itemAction | ODA_SELECT) && (lpDrawItemStruct->itemState & ODS_SELECTED) )
//{
// pDC->SetTextColor( RGB(178,34,34));
// pDC->SetBkColor(crBack);
// pDC->FillSolidRect(&lpDrawItemStruct->rcItem, crBack);
//}
////如果选项处于未选中状态,则用下面的颜色
//else
pDC->FillSolidRect(&lpDrawItemStruct->rcItem,crBack);
char lpStr[LISTBOX_MAX_LEN];
ZeroMemory(lpStr,sizeof(lpStr));
GetText(lpDrawItemStruct->itemID,lpStr ); //得到串
//靠数据的长短来判断显示的颜色
if(strlen(lpStr)>30)
pDC->SetTextColor(crRedText);
else
pDC->SetTextColor(crBlackText);
// SetItemHeight(0,log.lfHeight+10); //设置box格子的高度
DrawText(lpDrawItemStruct->hDC,lpStr, -1, &lpDrawItemStruct->rcItem, DT_LEFT | DT_SINGLELINE); // restore DC colors
pDC->SetTextColor(crOldTextColor); //恢复字体颜色
pDC->SetBkColor(crOldBkColor); //恢复背景颜色
}
然后当在m_sonListBox中添加项时,就会相应的显示不同的颜色(本人是根据添加字符的长度显示的,见上面代码)