我正在用 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
与自定义绘图配合得很好,但在滚动和导航期间绘图会重复,因为无法删除旧的自定义内容。