메시지맵에 다음을 추가한다.
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
'프로그래밍 > MFC (C++)' 카테고리의 다른 글
MFC ] 클래스 마법사 오류 (0) | 2023.09.15 |
---|---|
MFC ] 엔터, ESC 키 입력시 종료되지 않게하기 (0) | 2023.09.15 |
MFC ] 쓰레드의 생성 및 시작, 종료, 일시 중단, 재개 (0) | 2022.09.18 |
MFC ] 새 코드 요소를 반환하지 못했습니다. 구문 오류일 수 있습니다. 해결방법 (0) | 2022.09.18 |
Warning: skipping non-radio button in group 경고 제거하는 법 (0) | 2022.09.14 |