0

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カスタム描画とうまく調和しますが、古いカスタムのものを消去する方法がないため、スクロールとナビゲーション中に描画が複製されます。

4

0 に答える 0