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

版权声明:请在征得作者同意的情况下,可以进行非盈利性引用。引用请注明出处:“作者:慕华思弦 转载地址” 字样,以尊重作者的劳动成果,并保持良好的版权意识。 https://blog.csdn.net/Superman___007/article/details/86536443

这里使用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;
	}
}

  部分参考 : https://blog.csdn.net/xilichong/article/details/21179761

猜你喜欢

转载自blog.csdn.net/Superman___007/article/details/86536443