mfc中设置listcontrol某一行的背景和文字颜色

来源:互联网 发布:北京淘宝电商培训 编辑:程序博客网 时间:2024/05/18 03:37

MFC中用到listcontrol控件,可能会根据内容显示颜色。本文提供一种方式:

listcontrol设置为report格式,根据内容设置某一行的背景和文字颜色。具体用listcontrol的SetItemData设置某一行的属性,通过自定义属性标识实现。

注:暂时只找到了设置一行的颜色,但是不能做到设置某一个单元格的颜色,如果有网友知道设置某一个单元格的颜色解决方案,欢迎交流,谢谢。

下面以实例说明:

自定义某行内容颜色属性:

#define COLOR_DEFAULT0 //默认颜色
#define COLOR_RED 1//红色
#define COLOR_BLUE 2//蓝色

对需要设置某行内容,调用BOOL SetItemData(_In_ int nItem, _In_ DWORD_PTR dwData);其中nItem为某行位置,下标以0开始,dwData可为自定义颜色属性,如上宏定义,然后在NM_CUSTOMDRAW事件中处理。

示例对话框中有一个listcontrol,和两个button,分别设置红色和蓝色。如图:


初始化listcontrol内容,这里测试,写得比较简单

控件变量为m_lstControl,自定义函数oid InitListControl();

void CListControlExampleDlg::InitListControl(){DWORD dwStyle = m_lstControl.GetExtendedStyle(); dwStyle |= LVS_EX_GRIDLINES;// 网格线   dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox 控件dwStyle |= LVS_EX_FULLROWSELECT;// 选中某行使整行高亮m_lstControl.SetExtendedStyle(dwStyle); // 设置扩展风格CRect rect;m_lstControl.GetClientRect(&rect);//在列表控件中插入列  m_lstControl.InsertColumn(0, _T("第一列"), LVCFMT_CENTER, rect.Width() / 3);  m_lstControl.InsertColumn(1, _T("第二列"), LVCFMT_CENTER, rect.Width() / 3);  m_lstControl.InsertColumn(2, _T("第三列"), LVCFMT_CENTER, rect.Width() / 3);  m_lstControl.InsertItem(0, _T("测试文字1"));m_lstControl.InsertItem(1, _T("测试文字2"));m_lstControl.InsertItem(2, _T("测试文字3"));m_lstControl.SetItemText(0, 1, _T("蓝色"));m_lstControl.SetItemText(1, 1, _T("红色"));UpdateData(FALSE);return;}

listcontrol设置处理事件,选择NM_CUSTOMDRAW。

void CListControlExampleDlg::OnNMCustomdrawList1(NMHDR *pNMHDR, LRESULT *pResult){LPNMTVCUSTOMDRAW pNMCD = reinterpret_cast<LPNMTVCUSTOMDRAW>(pNMHDR);// TODO: 在此添加控件通知处理程序代码NMCUSTOMDRAW nmCustomDraw = pNMCD->nmcd;switch(nmCustomDraw.dwDrawStage){case CDDS_ITEMPREPAINT:{if (COLOR_BLUE == nmCustomDraw.lItemlParam){pNMCD->clrTextBk = RGB(51, 153, 255);pNMCD->clrText = RGB(255, 255, 255);}else if (COLOR_RED == nmCustomDraw.lItemlParam){pNMCD->clrTextBk = RGB(255, 0, 0);//背景颜色pNMCD->clrText = RGB(255, 255, 255);//文字颜色}else if (COLOR_DEFAULT == nmCustomDraw.lItemlParam){pNMCD->clrTextBk = RGB(255, 255, 255);pNMCD->clrText = RGB(0, 0, 0);}else{//}break;}default:{break;}}*pResult = 0;*pResult |= CDRF_NOTIFYPOSTPAINT;//必须有,不然就没有效果*pResult |= CDRF_NOTIFYITEMDRAW;//必须有,不然就没有效果return;}

然后为两个按钮添加点击事件

void CListControlExampleDlg::OnBnClickedButton1(){// TODO: 在此添加控件通知处理程序代码m_lstControl.SetItemData(0, COLOR_BLUE);m_lstControl.SetItemData(1, COLOR_DEFAULT);//m_lstControl.Invalidate(TRUE);//UpdateData(FALSE);return;}void CListControlExampleDlg::OnBnClickedButton2(){// TODO: 在此添加控件通知处理程序代码m_lstControl.SetItemData(0, COLOR_DEFAULT);m_lstControl.SetItemData(1, COLOR_RED);//m_lstControl.Invalidate(TRUE);//UpdateData(FALSE);return;}

运行效果如图:




原创粉丝点击