ListCtrl失去焦点仍然高亮显示并改变单元格颜色

2024-02-25 07:32

本文主要是介绍ListCtrl失去焦点仍然高亮显示并改变单元格颜色,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里使用VS2010的MFC进行讲解 :

1.找到需要添加的消息的ListControl控件的属性,选择事件里面,选择NM_CUSTOMDRAW事件,程序自动生成方法.

2.在.cpp文件中自动生成的 OnNMCustomdrawList1 方法里面添加代码.

  (1).为List实现失去焦点仍然高亮显示.

void CDlgDacggl::OnNMCustomdrawList1(NMHDR *pNMHDR, LRESULT *pResult)
{NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);*pResult = CDRF_DODEFAULT;if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage){*pResult = CDRF_NOTIFYITEMDRAW;}else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage){*pResult = CDRF_NOTIFYSUBITEMDRAW;}else if ((CDDS_ITEMPREPAINT|CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage){COLORREF m_clrText2,m_clrBKcolor;int nItem = static_cast<int>(pLVCD->nmcd.dwItemSpec);POSITION pos = m_ctrDacgglList.GetFirstSelectedItemPosition();int index = m_ctrDacgglList.GetNextSelectedItem(pos); //获取鼠标点击的哪一项索引if (nItem == index)    //某一项被选中则显示{m_clrText2 = RGB(255,255,255);m_clrBKcolor = RGB(49,106,197);}else    //其余的默认如下{m_clrText2 = RGB(0,0,0);m_clrBKcolor = RGB(255,255,255);}pLVCD->clrText = m_clrText2;pLVCD->clrTextBk = m_clrBKcolor;}
}

  (2).为List相应的单元格添加字体颜色.

void CDlgDacggl::OnNMCustomdrawList1(NMHDR *pNMHDR, LRESULT *pResult)
{NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);*pResult = CDRF_DODEFAULT;if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage){*pResult = CDRF_NOTIFYITEMDRAW;}else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage){*pResult = CDRF_NOTIFYSUBITEMDRAW;}else if ((CDDS_ITEMPREPAINT|CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage){COLORREF m_clrText,m_clrBKColor;int nItem = static_cast<int>(pLVCD->nmcd.dwItemSpec);// 判断使ListCtrl不同颜色现实的条件CString str = m_ctrDacgglList.GetItemText(nItem,2); //获取控件第二列的值,m_list为控件的变量if (str == "有" && 2 == pLVCD->iSubItem)    //这里我的第三列单元格里面有一个汉字 "有" 字,若单元格里为 "有" 字,则显示下面的RGB,反之.{//设置该列的颜色m_clrText = RGB(255,127,0);}else if (str == "无" && 2 == pLVCD->iSubItem){m_clrText = RGB(0,139,139);}else    //其他Text默认为RGB(0,0,0){m_clrText = RGB(0,0,0);}pLVCD->clrText = m_clrText;*pResult = CDRF_DODEFAULT;}
}

(3).在List失去焦点后仍然高亮显示,并且改变单元格的文字颜色,还可以在失去焦点后再改变文字颜色.

void CDlgDacggl::OnNMCustomdrawList1(NMHDR *pNMHDR, LRESULT *pResult)
{NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);*pResult = CDRF_DODEFAULT;if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage){*pResult = CDRF_NOTIFYITEMDRAW;}else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage){*pResult = CDRF_NOTIFYSUBITEMDRAW;}else if ((CDDS_ITEMPREPAINT|CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage){COLORREF m_clrText,m_clrBKColor;int nItem = static_cast<int>(pLVCD->nmcd.dwItemSpec);CString str = m_ctrDacgglList.GetItemText(nItem,2);	//获取控件第二列的值,m_list为控件的变量BOOL bSelect = FALSE;POSITION pos = m_ctrDacgglList.GetFirstSelectedItemPosition();while(pos)    //第二步当选中时,失去焦点高亮显示{int index = m_ctrDacgglList.GetNextSelectedItem(pos);if(index==nItem){bSelect = TRUE;break;}}if (bSelect)    //当失去焦点后再回来改变单元格里字体的颜色{m_clrText = RGB(255,255,255);//"有"是单元格里的字符,2==pLVCD->iSubItem 是等于第三列的索引时if (str == "有" && 2 == pLVCD->iSubItem){//设置该列的颜色m_clrText = RGB(255,127,0);}m_clrBKColor = RGB(51,102,205);}else    //第一步显示这里的代码块{m_clrText = RGB(0,0,0);if (str == "有" && 2 == pLVCD->iSubItem){//设置该列的颜色m_clrText = RGB(255,127,0);}else if (str == "无" && 2 == pLVCD->iSubItem){m_clrText = RGB(0,139,139);}m_clrBKColor = RGB(255,255,255);}pLVCD->clrText = m_clrText;pLVCD->clrTextBk = m_clrBKColor;*pResult = CDRF_DODEFAULT;}
}

  部分参考 : MFC listCtrl选中某一项,LIST失去焦点时,该项仍然显示高亮_字子昂的博客-CSDN博客

而我已经分不清,你是友情,还是错过的爱情。《蒲公英的约定》

这篇关于ListCtrl失去焦点仍然高亮显示并改变单元格颜色的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/744793

相关文章

如何设置vim永久显示行号

《如何设置vim永久显示行号》在Linux环境下,vim默认不显示行号,这在程序编译出错时定位错误语句非常不便,通过修改vim配置文件vimrc,可以在每次打开vim时永久显示行号... 目录设置vim永久显示行号1.临时显示行号2.永www.chinasem.cn久显示行号总结设置vim永久显示行号在li

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

小程序button控件上下边框的显示和隐藏

问题 想使用button自带的loading图标功能,但又不需要button显示边框线 button控件有一条淡灰色的边框,在控件上了样式 border:none; 无法让button边框隐藏 代码如下: <button class="btn">.btn{border:none; /*一般使用这个就是可以去掉边框了*/} 解决方案 发现button控件有一个伪元素(::after

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if