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
}

尽管文档说必须从 CDDS_PREPAINT 返回相应的 CDRF ,但使用所有记录在案的方式,我试图让视图发送任何CDDS_*ERASE消息,但一点运气都没有。我在做/想要一些完全不可能的事情吗?

UPD:自定义绘制在窗口过程中完成。被pResult正确返回,CDDS_ITEMPOSTPAINT被捕获并正确处理。只是CDDS_*ERASE保持未触发。

用例:我需要捕捉 TreeView 项目从其先前坐标中删除的时刻,以便能够运行一些自定义清理代码。这CDDS_ITEMPOSTPAINT与自定义绘图配合得很好,但在滚动和导航期间绘图会重复,因为无法删除旧的自定义内容。

4

0 回答 0