2016-11-11 3 views
0

Я пытаюсь изменить цвет текста строки из списка, созданного мной из ресурса. Для этого я обрабатываю 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 
+0

Это более запутанным, когда вы используете детали просмотра (LVS_REPORT), вам придется обычая-рисовать подпункты. Это требует возврата CDRF_NOTIFYSUBITEMDRAW | CDRF_NEWFONT с этапа CDDS_PREPAINT. [Указано здесь] (https://msdn.microsoft.com/en-us/library/windows/desktop/ff919573 (v = vs.85) .aspx). –

+0

Я отлично справляюсь с раскраской всей строки на данный момент, но я не могу даже заставить это работать в моей программе. Я немного поработал и сделал новый тестовый проект с виртуальным списком, в котором обработал уведомление в процессе окна (так что нет диалога), и он сработал. Может быть, это не работает из-за модального диалогового окна? – ptim

+0

[Возврат значений из процедуры диалога] (https://blogs.msdn.microsoft.com/oldnewthing/20031107-00/?p=41923). – IInspectable

ответ

0

Я выяснял проблему: WM_NOTIFY обрабатывается внутри диалога около того Конечно, я должен return the values accordingly. Проблема заключалась в том, что я использовал неверную переменную для окна (hEdit в этом случае).

Это исправленная версия, если кто-то заботится:

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: 
        lplvcd->clrText = RGB(255, 0, 0); 
        result = CDRF_NEWFONT; 
        break; 
      } 
      SetWindowLongPtr(hDialog, DWLP_MSGRESULT, result); 
      return TRUE; 
     } 
     break; 
Смежные вопросы