2016-11-11 4 views
0

Ich versuche, die Zeile Textfarbe einer Listenansicht zu ändern, die ich von einer Ressource gemacht habe. Dafür handle ich NM_CUSTOMDRAW in meinem Dialogprozess. Es ist ein modales Dialogfeld, wenn das wichtig ist. Nach the documentation, dwDrawStage sollte CDDS_ITEMPREPAINT nach der Rückkehr CDRF_NOTIFYITEMDRAW entsprechen. Aber das ist nicht der Fall. Ich erhalte CDDS_PREPAINT für jeden Artikel.C++ winapi listview NM_CUSTOMDRAW: bekomme CDDS_ITEMPREPAINT nicht

Was habe ich falsch gemacht? Diese

ist, wie ich auf die Nachricht antworten:

 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; 

das sind die Eigenschaften des 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

Es verschachtelter ist, wenn Sie die Daten verwenden, sehen (LVS_REPORT), die Sie individuell zeichnen die Unterpunkte haben werden. Dazu muss CDRF_NOTIFYSUBITEMDRAW | zurückgegeben werden CDRF_NEWFONT aus der CDDS_PREPAINT-Phase. [Erwähnt hier] (https://msdn.microsoft.com/en-us/library/windows/desktop/ff919573 (v = vs.85) .aspx). –

+0

Ich bin vollkommen in Ordnung mit der Färbung der gesamten Reihe für jetzt, aber ich kann nicht einmal das in meinem Programm arbeiten. Ich habe ein wenig getestet und ein neues Testprojekt mit einer virtuellen Listenansicht erstellt, wo ich die Benachrichtigung im Fensterprozess (also ohne Dialog) bearbeitet habe, und es hat funktioniert. Vielleicht funktioniert es wegen des modalen Dialogfelds nicht? – ptim

+0

[Zurückgeben von Werten aus einer Dialogprozedur] (https://blogs.msdn.microsoft.com/oldnewthing/20031107-00/?p=41923). – IInspectable

Antwort

0

ich das Problem herausgefunden: WM_NOTIFY in einem Dialog behandelt wird so von Natürlich muss ich return the values accordingly. Das Problem war, dass ich die falsche Variable für das Fenster verwendet habe (hEdit in diesem Fall).

Dies ist die korrigierte Version, wenn jemand sich interessiert:

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;