본문 바로가기
프로그래밍/MFC (C++)

MFC ] 리스트 컨트롤에 행 단위 색상 입히기 (글자색/배경색)

by eteo 2022. 9. 18.

 

 

 

 

 

 

 

 

메시지맵에 다음을 추가한다.

 

BEGIN_MESSAGE_MAP(CdeltaControlDlg, CDialogEx)
	//...
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST_MEMORY, OnCustomdrawMyList)
END_MESSAGE_MAP()

 

notification code가 NM_CUSTOMDRAW 일 때 내 리스트 컨트롤 ID로 부터 온 WM_NOTIFY

메시지를 핸들 하고 싶다는 뜻이다. 

 

 

 

 

 

헤더에 메시지 처리함수의 원형을 선언한다.

 

afx_msg void OnCustomdrawMyList(NMHDR* pNMHDR, LRESULT* pResult);

 

 

 

 

 

 

메시지 처리 함수의 정의

 

void CdeltaControlDlg::OnCustomdrawMyList(NMHDR* pNMHDR, LRESULT* pResult)
{
	NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);

	// Take the default processing unless we 
	// set this to something else below.
	*pResult = CDRF_DODEFAULT;

	// First thing - check the draw stage. If it's the control's prepaint
	// stage, then tell Windows we want messages for every item.

	if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage)
	{
		*pResult = CDRF_NOTIFYITEMDRAW;
	}
	else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage)
	{
			// This is the prepaint stage for an item. Here's where we set the
			// item's text color. Our return value will tell Windows to draw the
			// item itself, but it will use the new color we set here.
			// We'll cycle the colors through red, green, and light blue.

		COLORREF crText = RGB(0, 0, 0);
		COLORREF crBkgnd = RGB(255, 255, 255);


		if (m_list.GetItemText(pLVCD->nmcd.dwItemSpec, 1) == _T("WAIT")) 
		{
			crText = RGB(200, 0, 0);
		}
		else if (m_list.GetItemText(pLVCD->nmcd.dwItemSpec, 1) == _T("MOVE"))
		{
			crText = RGB(0, 200, 0);
		}
		else if (m_list.GetItemText(pLVCD->nmcd.dwItemSpec, 1) == _T("PUMP"))
		{
			crText = RGB(0, 0, 200);
		}

		if (pLVCD->nmcd.dwItemSpec == currentRow) 
		{
			crBkgnd = RGB(255, 255, 0);
		}

		// Store the color back in the NMLVCUSTOMDRAW struct.
		pLVCD->clrText = crText;
		pLVCD->clrTextBk = crBkgnd;

		// Tell Windows to paint the control itself.
		*pResult = CDRF_DODEFAULT;
	}
}

 

prepaint stage에서 위와같이 파라미터로 들어오는 pLVCD->nmcd.dwItemSpec 을 활용해서 얼마든지 색상을 지정할 수 있다. pLVCD->nmcd.dwItemSpec 는 리스트 컨트롤의 행 번호가 차례로 들어온다.

 

기본 글자색은 검정색, 기본 배경색은 흰색이다.

글자색은 리스트 컨트롤의 멤버 함수인 .GetItemText()를 활용하여 해당 행의 인덱스 1번째 열이 WAIT 인 경우 빨간색, MOVE인 경우 초록색, PUMP인 경우 파란색으로 했다.

 

그리고 쓰레드에서 현재 작업중인 row는 배경색을 노란색으로 설정하게끔 했다.

 

 

 

 

 

 

 

 

Reference : https://www.codeproject.com/Articles/79/Neat-Stuff-to-Do-in-List-Controls-Using-Custom-Dra