WindowsXP SDK VC2005
リストビューのカスタムドローについて質問です。
case NM_CUSTOMDRAW:
lplvcd = (LPNMLVCUSTOMDRAW)lParam;
switch( lplvcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
return TRUE;
case CDDS_ITEMPREPAINT:
return TRUE;
case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
return TRUE;
}
return CDRF_DODEFAULT;
CDDS_PREPAINT には処理がうつります
CDDS_ITEMPREPAINT にも処理がうつります
CDDS_ITEMPREPAINT|CDDS_SUBITEM これには処理が移りません。
特定のセルの背景だけ色を変えたいのですが・・・。
CDDS_SUBITEMをつかまえて、特定のセルの色を変えたいと思っています。
CDDS_SUBITEMをつかまえるにはどうしたらいいでしょうか。
宜しくお願い致します。
言い忘れてしまいましたが、ダイアログベースで作成しています。
case CDDS_PREPAINT:
return CDRF_NOTIFYSUBITEMDRAW;
case CDDS_ITEMPREPAINT:
return CDRF_NOTIFYSUBITEMDRAW;
case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
...ここでいろいろする...
return CDRF_DODEFAULT;
↑こちらのように、returnを書き換えましたが、結果は同じでした。
case CDDS_ITEMPREPAINT | CDDS_SUBITEM のしたにブレークポイントを置いても、
HITしませんでした。
case CDDS_PREPAINT:
SetWindowLong( hWndDebug, DWL_MSGRESULT,(long)CDRF_NOTIFYITEMDRAW );
return TRUE;
case CDDS_ITEMPREPAINT:
SetWindowLong( hWndDebug, DWL_MSGRESULT,(long)CDRF_NEWFONT);
return TRUE;
case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
-処理-
SetWindowLong( hWndDebug, DWL_MSGRESULT,(long)CDRF_NEWFONT);
return TRUE;
↑いまはこう書いていますが、結果は同じでした・・・
写し間違いかもしれませんが、
「今はこう書いています」の方のコードでは、
CDRF_NOTIFYSUBITEMDRAW
を返していませんよ。
レスありがとうございます。
以下のように、CDRF_NOTIFYITEMDRAWをリターンさせてみましたが、
結果は同じで、ブレークポイントにヒットしませんでした。
case CDDS_PREPAINT:
SetWindowLong( hWndDebug, DWL_MSGRESULT,(long)CDRF_NOTIFYITEMDRAW );
return CDRF_NOTIFYITEMDRAW;
case CDDS_ITEMPREPAINT:
SetWindowLong( hWndDebug, DWL_MSGRESULT,(long)CDRF_NEWFONT);
return CDRF_NOTIFYITEMDRAW;
case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
-処理-
SetWindowLong( hWndDebug, DWL_MSGRESULT,(long)CDRF_NEWFONT);
return TRUE;
うーん・・・何が悪いのやら・・
case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
のところで、CDRF_NOTIFYITEMDRAW や CDRF_NEWFONTをリターンしてみても、結果は同
じでした。
この場合、返すとは、
SetWindowLong( hWndDebug, DWL_MSGRESULT,(long)CDRF_NOTIFYITEMDRAW);
とするという意味です。
なるほど。そういうことでしたか。
SetWindowLong( hWndDebug, DWL_MSGRESULT,(long)CDRF_NOTIFYITEMDRAW);
としたら、ちゃんとCDDS_SUBITEMが送られてきました!
diarygoodsさん、どうもありがとうございました。
おかげさまで、解決しました。