CListCtrl控件,如何修改当前选中行的颜色?

teleinfor 2019-11-15 01:19:04
需求:修改选中行(FOCUSED & SELECTED)行背景和字体颜色。
默认当前选中行(获取焦点和选中状态)为蓝色高亮显示,我想修改当前鼠标点击行颜色为红色背景、白色前景。
如下自绘代码仅仅能实现,失去焦点后的行颜色修改。焦点状态依然是默认的蓝色高亮!如何修改这个默认的颜色呢???已经设置了FOCUSED和SELECTED颜色一致,可是没有任何效果展示。


NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
*pResult = 0;
int nItem = -111;
int nSubItem = -111;
COLORREF clrNewTextColor, clrNewBkColor;
//Switch between different draw stages
switch (pLVCD->nmcd.dwDrawStage) {

case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;
break;

case CDDS_ITEMPREPAINT:

*pResult = CDRF_NOTIFYSUBITEMDRAW;
break;

case CDDS_ITEMPREPAINT | CDDS_SUBITEM:

nItem = static_cast<int>(pLVCD->nmcd.dwItemSpec); //获取当前重绘行索引
nSubItem = static_cast<int>(pLVCD->iSubItem); //获取当前重绘列索引

if (m_list.GetItemState(nItem, LVIS_FOCUSED|LVIS_SELECTED)) //如果重绘行就是选中的单元格所在的行
{
clrNewTextColor = RGB(255, 255, 255); //设置文本颜色
clrNewBkColor = RGB(255, 0, 0); //设置背景颜色
pLVCD->clrText = clrNewTextColor;
pLVCD->clrTextBk = clrNewBkColor;
}
else
{
clrNewTextColor = RGB(0, 0, 0);
clrNewBkColor = RGB(143, 193, 60);
pLVCD->clrText = clrNewTextColor;
pLVCD->clrTextBk = clrNewBkColor;
}
//else if (nSubItem == SelectCol) //如果重绘列是选中的单元格所在的列
//{
// clrNewTextColor = RGB(0, 0, 0);
// clrNewBkColor = RGB(230, 230, 250);
// pLVCD->clrText = clrNewTextColor;
// pLVCD->clrTextBk = clrNewBkColor;
//}
//else if (nSubItem > SelectCol) //只显示一列,如果没有这个判断就会显示后面所有列
//{
// clrNewTextColor = RGB(0, 0, 0);
// clrNewBkColor = RGB(255, 255, 255);
// pLVCD->clrText = clrNewTextColor;
// pLVCD->clrTextBk = clrNewBkColor;
//}
*pResult = CDRF_DODEFAULT;
break;

default:
break;

}
...全文
789 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
teleinfor 2019-11-15
  • 打赏
  • 举报
回复
引用 7 楼 若歌 的回复:
引用 5 楼 teleinfor 的回复:
我想用NM_CUSTOMDRAW轻量级的自绘来实现,不知道如何做呢? [quote=引用 1 楼 若歌 的回复:] DrawItem中重绘可以解决选中高亮颜色的问题
CDIS_SELECTED 试试这个属性?[/quote] 嗯,我试试看。多谢。
若歌 2019-11-15
  • 打赏
  • 举报
回复
引用 5 楼 teleinfor 的回复:
我想用NM_CUSTOMDRAW轻量级的自绘来实现,不知道如何做呢?
引用 1 楼 若歌 的回复:
DrawItem中重绘可以解决选中高亮颜色的问题
CDIS_SELECTED 试试这个属性?
若歌 2019-11-15
  • 打赏
  • 举报
回复
对的,我这个写了,是为了在单元格里添加按钮的,你可以忽略这个步骤,直接自绘颜色就行,控件的属性要改成 owner Draw fixed
teleinfor 2019-11-15
  • 打赏
  • 举报
回复
我想用NM_CUSTOMDRAW轻量级的自绘来实现,不知道如何做呢?
引用 1 楼 若歌 的回复:
DrawItem中重绘可以解决选中高亮颜色的问题
teleinfor 2019-11-15
  • 打赏
  • 举报
回复
多谢。请问这个代码是需要从CListCtrl派生一个子类,然后重绘么?请明示。
引用 2 楼 若歌 的回复:
void CListCtrlCl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 
	// TODO:  添加您的代码以绘制指定项
	TCHAR lpBuffer[256];
 
	LV_ITEM lvi;
	lvi.mask = LVIF_TEXT | LVIF_PARAM ;
	lvi.iItem = lpDrawItemStruct->itemID ; 
	lvi.iSubItem = 0;
	lvi.pszText = lpBuffer ;
	lvi.cchTextMax = sizeof(lpBuffer);
	VERIFY(GetItem(&lvi));
 
 
	LV_COLUMN lvc, lvcprev ;
	::ZeroMemory(&lvc, sizeof(lvc));
	::ZeroMemory(&lvcprev, sizeof(lvcprev));
	lvc.mask = LVCF_WIDTH | LVCF_FMT;
	lvcprev.mask = LVCF_WIDTH | LVCF_FMT;
 
	CDC* pDC;
	pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	CRect rtClient;
	GetClientRect(&rtClient);
	
 
	for ( int nCol=0; GetColumn(nCol, &lvc); nCol++)
	{
		if ( nCol > 0 ) 
		{
			// Get Previous Column Width in order to move the next display item
			GetColumn(nCol-1, &lvcprev) ;
			lpDrawItemStruct->rcItem.left += lvcprev.cx ;
			lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left; 
		}
 
		CRect rcItem;   
		if (!GetSubItemRect(lpDrawItemStruct->itemID,nCol,LVIR_LABEL,rcItem))   
			continue;   
 
		::ZeroMemory(&lvi, sizeof(lvi));
		lvi.iItem = lpDrawItemStruct->itemID;
		lvi.mask = LVIF_TEXT | LVIF_PARAM;
		lvi.iSubItem = nCol;
		lvi.pszText = lpBuffer;
		lvi.cchTextMax = sizeof(lpBuffer);
 
		VERIFY(GetItem(&lvi));
		CRect rcTemp;
		rcTemp = rcItem;
 
		CRgn rgn1;
		RECT tr = { rcItem.left - 1, rcItem.top, rcItem.right, rcItem.bottom };
		rgn1.CreateRectRgnIndirect(&tr);
 
		/*if (nCol==0)
		{
			rcTemp.left -=2;
		}*/
		if (m_nCreatBtnCol == lvi.iSubItem)//按钮位置移动
		{
			int cx = (rcTemp.left + rcTemp.right)/2;
			int cy = rcTemp.top+5;
 
			m_BtVect[lvi.iItem].m_Btn[0]->MoveWindow(cx - 45, cy, 40, 20);
			m_BtVect[lvi.iItem].m_Btn[1]->MoveWindow(cx + 5, cy, 40, 20);
 
		}
		
		if ( lpDrawItemStruct->itemState & ODS_SELECTED )
		{
			
			COLORREF color = GetBkColor(); //获取背景颜色
			//pDC->FillSolidRect(rcTemp,color);
			//内嵌窗体颜色绘制
			CBrush brush1(color);
			pDC->FillRgn(&rgn1, &brush1);
 
			//内嵌窗体边框绘制
			CBrush brush2(RGB(209, 209, 209));
			pDC->FrameRgn(&rgn1, &brush2, 1, 1);
 
			brush1.DeleteObject();
			brush2.DeleteObject();
 
 
		/*	//内嵌窗体颜色绘制  高亮处理
			CBrush brush1(GetSysColor(COLOR_HIGHLIGHT));
			pDC->FillRgn(&rgn1, &brush1);
			//内嵌窗体边框绘制
			CBrush brush2(RGB(209, 209, 209));
			pDC->FrameRgn(&rgn1, &brush2, 1, 1);
			brush1.DeleteObject();
			brush2.DeleteObject();
			//pDC->FillSolidRect(&rcTemp, GetSysColor(COLOR_HIGHLIGHT)) ;
			pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));	*/
		}
		else
		{
			COLORREF color = GetBkColor(); //获取背景颜色
			//pDC->FillSolidRect(rcTemp,color);
			//内嵌窗体颜色绘制
			CBrush brush1(color);
			pDC->FillRgn(&rgn1, &brush1);
 
			//内嵌窗体边框绘制
			CBrush brush2(RGB(209, 209, 209));
			pDC->FrameRgn(&rgn1, &brush2, 1, 1);
 
			brush1.DeleteObject();
			brush2.DeleteObject();
 
 
			if (FindColColor(nCol,color))//获取单元行颜色
			{
				CBrush brush1(color);
				pDC->FillRgn(&rgn1, &brush1);
 
				//内嵌窗体边框绘制
				CBrush brush2(RGB(209, 209, 209));
				pDC->FrameRgn(&rgn1, &brush2, 1, 1);
 
				brush1.DeleteObject();
				brush2.DeleteObject();;
			}
			if (FindItemColor(nCol,lpDrawItemStruct->itemID,color))//获取单元格颜色
			{
				CBrush brush1(color);
				pDC->FillRgn(&rgn1, &brush1);
 
				//内嵌窗体边框绘制
				CBrush brush2(RGB(209, 209, 209));
				pDC->FrameRgn(&rgn1, &brush2, 1, 1);
 
				brush1.DeleteObject();
				brush2.DeleteObject();;
			}
			
			//pDC->SetTextColor(m_color);
		}
 
		pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));
 
		UINT   uFormat    = DT_CENTER ;
		if (m_Header.m_Format[nCol]=='0')
		{
			uFormat = DT_LEFT;
		}
		else if (m_Header.m_Format[nCol]=='1')
		{
			uFormat = DT_CENTER;
		}
		else if (m_Header.m_Format[nCol]=='2')
		{
			uFormat = DT_RIGHT;
		}
		TEXTMETRIC metric;
		pDC->GetTextMetrics(&metric);
		int ofst;
		ofst = rcItem.Height() - metric.tmHeight;
		rcItem.OffsetRect(0,ofst/2);
		pDC->SetTextColor(m_color);
		COLORREF color;
		if (FindColTextColor(nCol,color))
		{
			pDC->SetTextColor(color);
		}
		if (FindItemTextColor(nCol,lpDrawItemStruct->itemID,color))
		{
			pDC->SetTextColor(color);
		}
		CFont nFont ,* nOldFont; 
		nFont.CreateFont(m_fontHeight,m_fontWith,0,0,0,FALSE,FALSE,0,0,0,0,0,0,_T("宋体"));//创建字体 
		nOldFont = pDC->SelectObject(&nFont);
		
		DrawText(lpDrawItemStruct->hDC, lpBuffer, _tcslen(lpBuffer), &rcItem, uFormat);
		pDC->SelectStockObject(SYSTEM_FONT) ;
	}
 
 
}

————————————————
版权声明:本文为CSDN博主「若歌」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36568418/article/details/102922111void CListCtrlCl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 
	// TODO:  添加您的代码以绘制指定项
	TCHAR lpBuffer[256];
 
	LV_ITEM lvi;
	lvi.mask = LVIF_TEXT | LVIF_PARAM ;
	lvi.iItem = lpDrawItemStruct->itemID ; 
	lvi.iSubItem = 0;
	lvi.pszText = lpBuffer ;
	lvi.cchTextMax = sizeof(lpBuffer);
	VERIFY(GetItem(&lvi));
 
 
	LV_COLUMN lvc, lvcprev ;
	::ZeroMemory(&lvc, sizeof(lvc));
	::ZeroMemory(&lvcprev, sizeof(lvcprev));
	lvc.mask = LVCF_WIDTH | LVCF_FMT;
	lvcprev.mask = LVCF_WIDTH | LVCF_FMT;
 
	CDC* pDC;
	pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	CRect rtClient;
	GetClientRect(&rtClient);
	
 
	for ( int nCol=0; GetColumn(nCol, &lvc); nCol++)
	{
		if ( nCol > 0 ) 
		{
			// Get Previous Column Width in order to move the next display item
			GetColumn(nCol-1, &lvcprev) ;
			lpDrawItemStruct->rcItem.left += lvcprev.cx ;
			lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left; 
		}
 
		CRect rcItem;   
		if (!GetSubItemRect(lpDrawItemStruct->itemID,nCol,LVIR_LABEL,rcItem))   
			continue;   
 
		::ZeroMemory(&lvi, sizeof(lvi));
		lvi.iItem = lpDrawItemStruct->itemID;
		lvi.mask = LVIF_TEXT | LVIF_PARAM;
		lvi.iSubItem = nCol;
		lvi.pszText = lpBuffer;
		lvi.cchTextMax = sizeof(lpBuffer);
 
		VERIFY(GetItem(&lvi));
		CRect rcTemp;
		rcTemp = rcItem;
 
		CRgn rgn1;
		RECT tr = { rcItem.left - 1, rcItem.top, rcItem.right, rcItem.bottom };
		rgn1.CreateRectRgnIndirect(&tr);
 
		/*if (nCol==0)
		{
			rcTemp.left -=2;
		}*/
		if (m_nCreatBtnCol == lvi.iSubItem)//按钮位置移动
		{
			int cx = (rcTemp.left + rcTemp.right)/2;
			int cy = rcTemp.top+5;
 
			m_BtVect[lvi.iItem].m_Btn[0]->MoveWindow(cx - 45, cy, 40, 20);
			m_BtVect[lvi.iItem].m_Btn[1]->MoveWindow(cx + 5, cy, 40, 20);
 
		}
		
		if ( lpDrawItemStruct->itemState & ODS_SELECTED )
		{
			
			COLORREF color = GetBkColor(); //获取背景颜色
			//pDC->FillSolidRect(rcTemp,color);
			//内嵌窗体颜色绘制
			CBrush brush1(color);
			pDC->FillRgn(&rgn1, &brush1);
 
			//内嵌窗体边框绘制
			CBrush brush2(RGB(209, 209, 209));
			pDC->FrameRgn(&rgn1, &brush2, 1, 1);
 
			brush1.DeleteObject();
			brush2.DeleteObject();
 
 
		/*	//内嵌窗体颜色绘制  高亮处理
			CBrush brush1(GetSysColor(COLOR_HIGHLIGHT));
			pDC->FillRgn(&rgn1, &brush1);
			//内嵌窗体边框绘制
			CBrush brush2(RGB(209, 209, 209));
			pDC->FrameRgn(&rgn1, &brush2, 1, 1);
			brush1.DeleteObject();
			brush2.DeleteObject();
			//pDC->FillSolidRect(&rcTemp, GetSysColor(COLOR_HIGHLIGHT)) ;
			pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));	*/
		}
		else
		{
			COLORREF color = GetBkColor(); //获取背景颜色
			//pDC->FillSolidRect(rcTemp,color);
			//内嵌窗体颜色绘制
			CBrush brush1(color);
			pDC->FillRgn(&rgn1, &brush1);
 
			//内嵌窗体边框绘制
			CBrush brush2(RGB(209, 209, 209));
			pDC->FrameRgn(&rgn1, &brush2, 1, 1);
 
			brush1.DeleteObject();
			brush2.DeleteObject();
 
 
			if (FindColColor(nCol,color))//获取单元行颜色
			{
				CBrush brush1(color);
				pDC->FillRgn(&rgn1, &brush1);
 
				//内嵌窗体边框绘制
				CBrush brush2(RGB(209, 209, 209));
				pDC->FrameRgn(&rgn1, &brush2, 1, 1);
 
				brush1.DeleteObject();
				brush2.DeleteObject();;
			}
			if (FindItemColor(nCol,lpDrawItemStruct->itemID,color))//获取单元格颜色
			{
				CBrush brush1(color);
				pDC->FillRgn(&rgn1, &brush1);
 
				//内嵌窗体边框绘制
				CBrush brush2(RGB(209, 209, 209));
				pDC->FrameRgn(&rgn1, &brush2, 1, 1);
 
				brush1.DeleteObject();
				brush2.DeleteObject();;
			}
			
			//pDC->SetTextColor(m_color);
		}
 
		pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));
 
		UINT   uFormat    = DT_CENTER ;
		if (m_Header.m_Format[nCol]=='0')
		{
			uFormat = DT_LEFT;
		}
		else if (m_Header.m_Format[nCol]=='1')
		{
			uFormat = DT_CENTER;
		}
		else if (m_Header.m_Format[nCol]=='2')
		{
			uFormat = DT_RIGHT;
		}
		TEXTMETRIC metric;
		pDC->GetTextMetrics(&metric);
		int ofst;
		ofst = rcItem.Height() - metric.tmHeight;
		rcItem.OffsetRect(0,ofst/2);
		pDC->SetTextColor(m_color);
		COLORREF color;
		if (FindColTextColor(nCol,color))
		{
			pDC->SetTextColor(color);
		}
		if (FindItemTextColor(nCol,lpDrawItemStruct->itemID,color))
		{
			pDC->SetTextColor(color);
		}
		CFont nFont ,* nOldFont; 
		nFont.CreateFont(m_fontHeight,m_fontWith,0,0,0,FALSE,FALSE,0,0,0,0,0,0,_T("宋体"));//创建字体 
		nOldFont = pDC->SelectObject(&nFont);
		
		DrawText(lpDrawItemStruct->hDC, lpBuffer, _tcslen(lpBuffer), &rcItem, uFormat);
		pDC->SelectStockObject(SYSTEM_FONT) ;
	}
 
 
}
zgl7903 2019-11-15
  • 打赏
  • 举报
回复
推荐开源的 CGridCtrl
若歌 2019-11-15
  • 打赏
  • 举报
回复
void CListCtrlCl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 
	// TODO:  添加您的代码以绘制指定项
	TCHAR lpBuffer[256];
 
	LV_ITEM lvi;
	lvi.mask = LVIF_TEXT | LVIF_PARAM ;
	lvi.iItem = lpDrawItemStruct->itemID ; 
	lvi.iSubItem = 0;
	lvi.pszText = lpBuffer ;
	lvi.cchTextMax = sizeof(lpBuffer);
	VERIFY(GetItem(&lvi));
 
 
	LV_COLUMN lvc, lvcprev ;
	::ZeroMemory(&lvc, sizeof(lvc));
	::ZeroMemory(&lvcprev, sizeof(lvcprev));
	lvc.mask = LVCF_WIDTH | LVCF_FMT;
	lvcprev.mask = LVCF_WIDTH | LVCF_FMT;
 
	CDC* pDC;
	pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	CRect rtClient;
	GetClientRect(&rtClient);
	
 
	for ( int nCol=0; GetColumn(nCol, &lvc); nCol++)
	{
		if ( nCol > 0 ) 
		{
			// Get Previous Column Width in order to move the next display item
			GetColumn(nCol-1, &lvcprev) ;
			lpDrawItemStruct->rcItem.left += lvcprev.cx ;
			lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left; 
		}
 
		CRect rcItem;   
		if (!GetSubItemRect(lpDrawItemStruct->itemID,nCol,LVIR_LABEL,rcItem))   
			continue;   
 
		::ZeroMemory(&lvi, sizeof(lvi));
		lvi.iItem = lpDrawItemStruct->itemID;
		lvi.mask = LVIF_TEXT | LVIF_PARAM;
		lvi.iSubItem = nCol;
		lvi.pszText = lpBuffer;
		lvi.cchTextMax = sizeof(lpBuffer);
 
		VERIFY(GetItem(&lvi));
		CRect rcTemp;
		rcTemp = rcItem;
 
		CRgn rgn1;
		RECT tr = { rcItem.left - 1, rcItem.top, rcItem.right, rcItem.bottom };
		rgn1.CreateRectRgnIndirect(&tr);
 
		/*if (nCol==0)
		{
			rcTemp.left -=2;
		}*/
		if (m_nCreatBtnCol == lvi.iSubItem)//按钮位置移动
		{
			int cx = (rcTemp.left + rcTemp.right)/2;
			int cy = rcTemp.top+5;
 
			m_BtVect[lvi.iItem].m_Btn[0]->MoveWindow(cx - 45, cy, 40, 20);
			m_BtVect[lvi.iItem].m_Btn[1]->MoveWindow(cx + 5, cy, 40, 20);
 
		}
		
		if ( lpDrawItemStruct->itemState & ODS_SELECTED )
		{
			
			COLORREF color = GetBkColor(); //获取背景颜色
			//pDC->FillSolidRect(rcTemp,color);
			//内嵌窗体颜色绘制
			CBrush brush1(color);
			pDC->FillRgn(&rgn1, &brush1);
 
			//内嵌窗体边框绘制
			CBrush brush2(RGB(209, 209, 209));
			pDC->FrameRgn(&rgn1, &brush2, 1, 1);
 
			brush1.DeleteObject();
			brush2.DeleteObject();
 
 
		/*	//内嵌窗体颜色绘制  高亮处理
			CBrush brush1(GetSysColor(COLOR_HIGHLIGHT));
			pDC->FillRgn(&rgn1, &brush1);
			//内嵌窗体边框绘制
			CBrush brush2(RGB(209, 209, 209));
			pDC->FrameRgn(&rgn1, &brush2, 1, 1);
			brush1.DeleteObject();
			brush2.DeleteObject();
			//pDC->FillSolidRect(&rcTemp, GetSysColor(COLOR_HIGHLIGHT)) ;
			pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));	*/
		}
		else
		{
			COLORREF color = GetBkColor(); //获取背景颜色
			//pDC->FillSolidRect(rcTemp,color);
			//内嵌窗体颜色绘制
			CBrush brush1(color);
			pDC->FillRgn(&rgn1, &brush1);
 
			//内嵌窗体边框绘制
			CBrush brush2(RGB(209, 209, 209));
			pDC->FrameRgn(&rgn1, &brush2, 1, 1);
 
			brush1.DeleteObject();
			brush2.DeleteObject();
 
 
			if (FindColColor(nCol,color))//获取单元行颜色
			{
				CBrush brush1(color);
				pDC->FillRgn(&rgn1, &brush1);
 
				//内嵌窗体边框绘制
				CBrush brush2(RGB(209, 209, 209));
				pDC->FrameRgn(&rgn1, &brush2, 1, 1);
 
				brush1.DeleteObject();
				brush2.DeleteObject();;
			}
			if (FindItemColor(nCol,lpDrawItemStruct->itemID,color))//获取单元格颜色
			{
				CBrush brush1(color);
				pDC->FillRgn(&rgn1, &brush1);
 
				//内嵌窗体边框绘制
				CBrush brush2(RGB(209, 209, 209));
				pDC->FrameRgn(&rgn1, &brush2, 1, 1);
 
				brush1.DeleteObject();
				brush2.DeleteObject();;
			}
			
			//pDC->SetTextColor(m_color);
		}
 
		pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));
 
		UINT   uFormat    = DT_CENTER ;
		if (m_Header.m_Format[nCol]=='0')
		{
			uFormat = DT_LEFT;
		}
		else if (m_Header.m_Format[nCol]=='1')
		{
			uFormat = DT_CENTER;
		}
		else if (m_Header.m_Format[nCol]=='2')
		{
			uFormat = DT_RIGHT;
		}
		TEXTMETRIC metric;
		pDC->GetTextMetrics(&metric);
		int ofst;
		ofst = rcItem.Height() - metric.tmHeight;
		rcItem.OffsetRect(0,ofst/2);
		pDC->SetTextColor(m_color);
		COLORREF color;
		if (FindColTextColor(nCol,color))
		{
			pDC->SetTextColor(color);
		}
		if (FindItemTextColor(nCol,lpDrawItemStruct->itemID,color))
		{
			pDC->SetTextColor(color);
		}
		CFont nFont ,* nOldFont; 
		nFont.CreateFont(m_fontHeight,m_fontWith,0,0,0,FALSE,FALSE,0,0,0,0,0,0,_T("宋体"));//创建字体 
		nOldFont = pDC->SelectObject(&nFont);
		
		DrawText(lpDrawItemStruct->hDC, lpBuffer, _tcslen(lpBuffer), &rcItem, uFormat);
		pDC->SelectStockObject(SYSTEM_FONT) ;
	}
 
 
}

————————————————
版权声明:本文为CSDN博主「若歌」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36568418/article/details/102922111void CListCtrlCl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 
	// TODO:  添加您的代码以绘制指定项
	TCHAR lpBuffer[256];
 
	LV_ITEM lvi;
	lvi.mask = LVIF_TEXT | LVIF_PARAM ;
	lvi.iItem = lpDrawItemStruct->itemID ; 
	lvi.iSubItem = 0;
	lvi.pszText = lpBuffer ;
	lvi.cchTextMax = sizeof(lpBuffer);
	VERIFY(GetItem(&lvi));
 
 
	LV_COLUMN lvc, lvcprev ;
	::ZeroMemory(&lvc, sizeof(lvc));
	::ZeroMemory(&lvcprev, sizeof(lvcprev));
	lvc.mask = LVCF_WIDTH | LVCF_FMT;
	lvcprev.mask = LVCF_WIDTH | LVCF_FMT;
 
	CDC* pDC;
	pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	CRect rtClient;
	GetClientRect(&rtClient);
	
 
	for ( int nCol=0; GetColumn(nCol, &lvc); nCol++)
	{
		if ( nCol > 0 ) 
		{
			// Get Previous Column Width in order to move the next display item
			GetColumn(nCol-1, &lvcprev) ;
			lpDrawItemStruct->rcItem.left += lvcprev.cx ;
			lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left; 
		}
 
		CRect rcItem;   
		if (!GetSubItemRect(lpDrawItemStruct->itemID,nCol,LVIR_LABEL,rcItem))   
			continue;   
 
		::ZeroMemory(&lvi, sizeof(lvi));
		lvi.iItem = lpDrawItemStruct->itemID;
		lvi.mask = LVIF_TEXT | LVIF_PARAM;
		lvi.iSubItem = nCol;
		lvi.pszText = lpBuffer;
		lvi.cchTextMax = sizeof(lpBuffer);
 
		VERIFY(GetItem(&lvi));
		CRect rcTemp;
		rcTemp = rcItem;
 
		CRgn rgn1;
		RECT tr = { rcItem.left - 1, rcItem.top, rcItem.right, rcItem.bottom };
		rgn1.CreateRectRgnIndirect(&tr);
 
		/*if (nCol==0)
		{
			rcTemp.left -=2;
		}*/
		if (m_nCreatBtnCol == lvi.iSubItem)//按钮位置移动
		{
			int cx = (rcTemp.left + rcTemp.right)/2;
			int cy = rcTemp.top+5;
 
			m_BtVect[lvi.iItem].m_Btn[0]->MoveWindow(cx - 45, cy, 40, 20);
			m_BtVect[lvi.iItem].m_Btn[1]->MoveWindow(cx + 5, cy, 40, 20);
 
		}
		
		if ( lpDrawItemStruct->itemState & ODS_SELECTED )
		{
			
			COLORREF color = GetBkColor(); //获取背景颜色
			//pDC->FillSolidRect(rcTemp,color);
			//内嵌窗体颜色绘制
			CBrush brush1(color);
			pDC->FillRgn(&rgn1, &brush1);
 
			//内嵌窗体边框绘制
			CBrush brush2(RGB(209, 209, 209));
			pDC->FrameRgn(&rgn1, &brush2, 1, 1);
 
			brush1.DeleteObject();
			brush2.DeleteObject();
 
 
		/*	//内嵌窗体颜色绘制  高亮处理
			CBrush brush1(GetSysColor(COLOR_HIGHLIGHT));
			pDC->FillRgn(&rgn1, &brush1);
			//内嵌窗体边框绘制
			CBrush brush2(RGB(209, 209, 209));
			pDC->FrameRgn(&rgn1, &brush2, 1, 1);
			brush1.DeleteObject();
			brush2.DeleteObject();
			//pDC->FillSolidRect(&rcTemp, GetSysColor(COLOR_HIGHLIGHT)) ;
			pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));	*/
		}
		else
		{
			COLORREF color = GetBkColor(); //获取背景颜色
			//pDC->FillSolidRect(rcTemp,color);
			//内嵌窗体颜色绘制
			CBrush brush1(color);
			pDC->FillRgn(&rgn1, &brush1);
 
			//内嵌窗体边框绘制
			CBrush brush2(RGB(209, 209, 209));
			pDC->FrameRgn(&rgn1, &brush2, 1, 1);
 
			brush1.DeleteObject();
			brush2.DeleteObject();
 
 
			if (FindColColor(nCol,color))//获取单元行颜色
			{
				CBrush brush1(color);
				pDC->FillRgn(&rgn1, &brush1);
 
				//内嵌窗体边框绘制
				CBrush brush2(RGB(209, 209, 209));
				pDC->FrameRgn(&rgn1, &brush2, 1, 1);
 
				brush1.DeleteObject();
				brush2.DeleteObject();;
			}
			if (FindItemColor(nCol,lpDrawItemStruct->itemID,color))//获取单元格颜色
			{
				CBrush brush1(color);
				pDC->FillRgn(&rgn1, &brush1);
 
				//内嵌窗体边框绘制
				CBrush brush2(RGB(209, 209, 209));
				pDC->FrameRgn(&rgn1, &brush2, 1, 1);
 
				brush1.DeleteObject();
				brush2.DeleteObject();;
			}
			
			//pDC->SetTextColor(m_color);
		}
 
		pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));
 
		UINT   uFormat    = DT_CENTER ;
		if (m_Header.m_Format[nCol]=='0')
		{
			uFormat = DT_LEFT;
		}
		else if (m_Header.m_Format[nCol]=='1')
		{
			uFormat = DT_CENTER;
		}
		else if (m_Header.m_Format[nCol]=='2')
		{
			uFormat = DT_RIGHT;
		}
		TEXTMETRIC metric;
		pDC->GetTextMetrics(&metric);
		int ofst;
		ofst = rcItem.Height() - metric.tmHeight;
		rcItem.OffsetRect(0,ofst/2);
		pDC->SetTextColor(m_color);
		COLORREF color;
		if (FindColTextColor(nCol,color))
		{
			pDC->SetTextColor(color);
		}
		if (FindItemTextColor(nCol,lpDrawItemStruct->itemID,color))
		{
			pDC->SetTextColor(color);
		}
		CFont nFont ,* nOldFont; 
		nFont.CreateFont(m_fontHeight,m_fontWith,0,0,0,FALSE,FALSE,0,0,0,0,0,0,_T("宋体"));//创建字体 
		nOldFont = pDC->SelectObject(&nFont);
		
		DrawText(lpDrawItemStruct->hDC, lpBuffer, _tcslen(lpBuffer), &rcItem, uFormat);
		pDC->SelectStockObject(SYSTEM_FONT) ;
	}
 
 
}
若歌 2019-11-15
  • 打赏
  • 举报
回复
DrawItem中重绘可以解决选中高亮颜色的问题

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧