Я пытаюсь изменить цвет текста строки из списка, созданного мной из ресурса. Для этого я обрабатываю NM_CUSTOMDRAW
внутри моего диалогового процесса. Это модальное диалоговое окно, если это имеет значение. Согласно the documentation, dwDrawStage
должен быть равен CDDS_ITEMPREPAINT
после возвращения CDRF_NOTIFYITEMDRAW
. Но это не так. Я получаю CDDS_PREPAINT
за каждый предмет.C++ winapi listview NM_CUSTOMDRAW: не получается CDDS_ITEMPREPAINT
Что я сделал не так?
Это, как я ответить на сообщение:
case WM_NOTIFY:
if (((LPNMHDR)lParam)->hwndFrom == GetDlgItem(hwnd, IDC_List2) && ((LPNMHDR)lParam)->code == NM_CUSTOMDRAW)
{
int result = CDRF_DODEFAULT;
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;
switch (lplvcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
result = CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT: //never gets executed
lplvcd->clrText = RGB(255, 0, 0);
result = CDRF_NEWFONT;
break;
}
//SetWindowLongPtr(hEdit, DWLP_MSGRESULT, result);
//return TRUE;
return result;
}
break;
Эти свойства ListView:
IDC_List2,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOLABELWRAP | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,205,18,363,197,WS_EX_CLIENTEDGE
Это более запутанным, когда вы используете детали просмотра (LVS_REPORT), вам придется обычая-рисовать подпункты. Это требует возврата CDRF_NOTIFYSUBITEMDRAW | CDRF_NEWFONT с этапа CDDS_PREPAINT. [Указано здесь] (https://msdn.microsoft.com/en-us/library/windows/desktop/ff919573 (v = vs.85) .aspx). –
Я отлично справляюсь с раскраской всей строки на данный момент, но я не могу даже заставить это работать в моей программе. Я немного поработал и сделал новый тестовый проект с виртуальным списком, в котором обработал уведомление в процессе окна (так что нет диалога), и он сработал. Может быть, это не работает из-за модального диалогового окна? – ptim
[Возврат значений из процедуры диалога] (https://blogs.msdn.microsoft.com/oldnewthing/20031107-00/?p=41923). – IInspectable