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中添加项时,就会相应的显示不同的颜色(本人是根据添加字符的长度显示的,见上面代码)
- MFC listBox 某一项数据显示不同的颜色
- 重绘ListBox实现特定行显示不同的颜色
- 让ListBox控件每一行显示不同的颜色
- 根据数据,显示不同的数据颜色
- DBGridEH根据某一字段不同值显示不同的行颜色
- 在C#中控制ListBox某一行的字体颜色
- ListView通过不同列的数据实现某一列颜色变化
- mfc ListBox显示
- 数据窗口的单双行显示颜色不同
- ListBox中,用不同的颜色绘制一行文字
- label 显示 不同的颜色
- 字符串显示不同的颜色
- VB.NET中根据DataGridView中显示的数据条件数据行显示不同的颜色
- bootstrap-table.js如何根据单元格数据不同显示不同的字体的颜色
- bootstrap-table.js如何根据单元格数据不同显示不同的字体的颜色
- C#实现item自定义颜色的ListBox,显示日志
- 设置字符串中某一字为不同的颜色
- DELPHI 让LISTBOX 不同内容的行显示不同颜色
- Java内部类
- Hibernate之抓取策略
- 74138集成电路译码器
- Android获取Toast的String解析
- C++ 指向函数的指针
- MFC listBox 某一项数据显示不同的颜色
- mod_jk(Apache+mod_jk+tomcat)详细配置方法
- 反转栈
- 三消游戏FSM状态机设计图
- 深入理解Android系列书籍资源分享更新
- JQuery实现图片切换(自动切换+手动切换)
- docker 容器相关命令
- 给菜单配置小图标
- 开始Linux之路