win32 でカスタマイズされた TreeView を実装しています。次のカスタム描画コードを用意します。
void treeCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMCUSTOMDRAW* pNMCustomDraw = (NMCUSTOMDRAW*)pNMHDR;
NMTVCUSTOMDRAW* pNMTVCustomDraw = (NMTVCUSTOMDRAW*)pNMHDR;
switch (pNMCustomDraw->dwDrawStage)
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYITEMERASE | CDRF_NOTIFYPOSTERASE;
break;
case CDDS_POSTERASE:
case CDDS_ITEMPOSTERASE:
// never happens
*pResult = CDRF_DODEFAULT;
break;
case CDDS_ITEMPREPAINT:
*pResult = CDRF_DODEFAULT;
break;
case CDDS_ITEMPOSTPAINT:
// some working code
}
文書化されたすべての方法で、対応する CDRF を CDDS_PREPAINT から返さなければならないというドキュメントにもかかわらず、ビューにメッセージを送信させようとしましたが、CDDS_*ERASE
まったく運がありませんでした。私はまったく不可能なことをしている/望んでいますか?
UPD: カスタム描画はウィンドウ プロシージャで行われます。pResult
が正しく返され、キャッチCDDS_ITEMPOSTPAINT
されて正しく処理されます。トリガーされCDDS_*ERASE
ないままです。
ユースケース: TreeView アイテムが以前の座標から消去される瞬間をキャッチする必要があるため、カスタム クリーンアップ コードを実行できます。はCDDS_ITEMPOSTPAINT
カスタム描画とうまく調和しますが、古いカスタムのものを消去する方法がないため、スクロールとナビゲーション中に描画が複製されます。