提问者:小点点

Win32 Listview Tilemode可交互项空间问题


当在tileview中自定义绘制listview项时,在CDDS_ITEMPREPAINT期间返回CDRF_SKIPDEFAULT会将该项的可交互矩形放大到实际项的大小(即从ListView_GetItemRect(LVIR_BOUNDS)接收的大小),而不只是图标+标签的大小。 这到底是如何发生的,又是为什么发生的呢? 我在文献和网络上都找不到一个明确的答案。 我的意思是,处理自定义油漆不应该只影响物品的油漆而不是你与它交互的方式吗?

代码采样:

::NMLVCUSTOMDRAW* pNMCustomDraw = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);

switch (pNMCustomDraw->nmcd.dwDrawStage)
{

    // Before the painting cycle begins. 
    case CDDS_PREPAINT:
    {

        return CDRF_NOTIFYITEMDRAW;

    }

    // Before an item is drawn.
    case CDDS_ITEMPREPAINT:
    {

        return CDRF_SKIPDEFAULT;
        
    }
    
}

问题的直观表示:


共1个答案

匿名用户

case CDDS_ITEM cdds_prepaint正在检查“或”ing“CDDS_ITEM cdds_prepaint的结果值。 另外,您已经选中了上面的CDDS_Prepaint。 不应该是CDDS_ItemPrepaint吗?

应该是这样的,大概是:

switch (pNMCustomDraw->nmcd.dwDrawStage)
{

    // Before the painting cycle begins. 
    case CDDS_PREPAINT:
    {
        return CDRF_NOTIFYITEMDRAW;

    }

    // Before an item is drawn.
    case CDDS_ITEM: // fall through
    case CDDS_ITEMPREPAINT:
    {

        return CDRF_SKIPDEFAULT;
        
    }
}

此外,MSDN声明:

CDRF_SKIPDEFAULT应用程序手动绘制项目。 控件将不会绘制该项。 当dwDrawStage等于CDDS_ItemPrepaint时,会发生这种情况。

在https://docs.microsoft.com/en-us/windows/win32/controls/nm-customdraw-list-view中

请同时选中此处(MSDN):

https://docs.microsoft.com/en-us/windows/win32/api/commctrl/ns-commctrl-nmcustomDraw

试试:)。如果需要的话,别忘了在大小写后面加上中断。问候