2016-11-11 156 views
0

我試圖改變我從資源製作的列表視圖的行文本顏色。爲此,我在對話過程中處理NM_CUSTOMDRAW。這是一個模態對話框,如果這很重要。根據the documentation, dwDrawStage在返回CDRF_NOTIFYITEMDRAW後應該等於CDDS_ITEMPREPAINT。但這種情況並非如此。我正在爲每件商品收到CDDS_PREPAINTC++ 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 |來自CDDS_PREPAINT階段的CDRF_NEWFONT。 [在此提及](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;