2016-11-11 20 views
0

リソースから作成したリストビューの行のテキストカラーを変更しようとしています。そのために、私はNM_CUSTOMDRAWをダイアログの処理の中で処理します。それが重要なのであれば、モーダルダイアログボックスです。 the documentationによれば、CDRF_NOTIFYITEMDRAWを返した後に dwDrawStageCDDS_ITEMPREPAINTに等しくなるはずです。しかし、そうではありません。商品ごとにCDDS_PREPAINTが届きます。C++ winapi listview NM_CUSTOMDRAW:CDDS_ITEMPREPAINTを取得しない

どうしたのですか? WM_NOTIFYは、のように、ダイアログ内で処理されます。私はこの問題を考え出し

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

 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コントロールのプロパティは次のとおりです。

この

は私がメッセージに応答する方法ですもちろん私は 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; 
関連する問題