MFC listBox 某一项数据显示不同的颜色

来源:互联网 发布:linux 关闭图形界面 编辑:程序博客网 时间:2024/05/16 09:37

    最近在做一个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中添加项时,就会相应的显示不同的颜色(本人是根据添加字符的长度显示的,见上面代码)

0 0
原创粉丝点击