在Windows XP上自定义绘制的列表视图

C++ - ListView Custom Drawn on Windows XP

本文关键字:列表 视图 绘制 自定义 Windows XP      更新时间:2023-10-16

我有ListView,其中项目完全使用我的代码绘制。当然,我使用NMLVCUSTOMDRAW提供的数据主要是RECTs。有两个矩形p->nmcd。rc和p->rcText,第一个携带有效信息,另一个总是0。这个问题就是nmcd。rc在Windows XP上不包含有效的rect,我得到0,1,0,2或类似的东西。

由于没有工作,我尝试使用ListView_GetItemIndexRect在Win XP上失败,而它在Win 7/10上工作。

看ListView_GetItemIndexRect的msdn页面,我可以看到,显然它只适用于Vista+。与此同时,在Vista+中列出的其他一些ListView函数在Windows XP中也可以正常工作。

Windows XP在我的程序的用户中很少见,但我仍然希望它能完美地运行。我自己绘制完整的列表视图肯定会解决这个问题,但这是一个死胡同。

查看本页第一条评论:

https://msdn.microsoft.com/en-us/library/windows/desktop/bb774778%28v=vs.85%29.aspx

处理Windows XP上的子项预绘制消息(可能全部))处理程序接收不正确的顶部和底部NMLVCUSTOMDRAW::nmcd中的值。Rc有时是0,有时是0没有更新,因为以前的处理程序调用(所以基本上的想法是它们未被comtl32调用者初始化)。为了得到处理程序必须显式获取的正确子项位置使用单独消息/调用的矩形:

RECT Position; ListView.GetSubItemRect((INT) pHeader->nmcd.dwItemSpec, pHeader->iSubItem, LVIR_BOUNDS, &Position);