sdk改變ListCtrl某一行的字體顏色或者背景顏色

ListCtrl的字體顏色如果直接通過SetTextColour設置的話會改變所有行的字體顏色,sdk的對話框工程想要改變ListCtrl的某一行顏色需要注意一下幾點:

1.在ListCtrl的父窗口響應WM_NOTIFY消息。

2.處理WM_NOTIFY的NM_CUSTOMDRAW消息,處理完之後通過SetWindowLong設置對話框返回結果。

3.處理完返回結果後對話框的回調函數要返回1。

具體代碼如下:

LRESULT TableDraw (LPARAM lp)
{
	int iRow;
	LPNMLVCUSTOMDRAW pListDraw = (LPNMLVCUSTOMDRAW)lp;
	switch(pListDraw->nmcd.dwDrawStage)
	{
	case CDDS_PREPAINT:
		return (CDRF_NOTIFYPOSTPAINT | CDRF_NOTIFYITEMDRAW);
	case CDDS_ITEMPREPAINT:
		{
			//pListDraw->clrText = RGB(0, 0, 255);
			pListDraw->clrTextBk = RGB(221, 222, 201);
		}
		return CDRF_NEWFONT;
	default:
		break;
	}
	return CDRF_DODEFAULT;
}

VOID OnNotify(HWND hdlg, WPARAM wp, LPARAM lp)
{
	NMHDR *header = (LPNMHDR)lp;
	if (s_dev_list == header->hwndFrom && NM_CUSTOMDRAW == header->code)
	{
		LPNMLISTVIEW pnm;
		pnm = (LPNMLISTVIEW)lp;
		if(pnm->hdr.hwndFrom == s_dev_list && pnm->hdr.code == NM_CUSTOMDRAW)
		{
			SetWindowLong(hdlg, DWL_MSGRESULT, long(TableDraw(lp)));
		}
	}
}

BOOL CALLBACK MainProc(HWND hdlg, UINT msg, WPARAM wp, LPARAM lp)
{
	int ret = 0;
	switch(msg)
	{
	case WM_INITDIALOG:
		{
			OnInitDialog(hdlg);
		}
		break;
	case  WM_NOTIFY:
		{
			OnNotify(hdlg, wp, lp);
			ret = 1;
		}
		break;
	case  WM_CLOSE:
		EndDialog(hdlg, 0);
		break;
	default:
		break;
	}
	return ret;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章