CustomDraw保留在PrePaint drawstage中

时间:2013-05-07 08:22:25

标签: visual-c++ mfc 64-bit custom-draw

在64位计算机上处​​理NM_CUSTOMDRAW消息时,我遇到了一些麻烦。我们有一个CListCtrl派生类,带有一个CHeaderCtrl派生头(通过PreSubclassWindow链接)。

在CHeader派生类中,我们做了一些自定义绘画。这适用于32位版本。但是当我构建64位变体时,drawstage仍然是CDDS_PREPAINT。

所以我在这里发帖以获得有关此问题的帮助。我在OnCustomDraw中尝试了很多结果值组合,drawstage处理......但是它们仍然只接收CDDS_PREPAINT drawstage。

这里有OnCustomDraw的当前测试代码:

void CListViewCtrlExHeader::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
    LPNMCUSTOMDRAW  lpnmcd = (LPNMCUSTOMDRAW )pNMHDR; 
    *pResult = CDRF_DODEFAULT; 
    if (lpnmcd) 
    { 
        switch (lpnmcd->dwDrawStage) 
        { 
            case CDDS_PREERASE: 
            { 
                    TRACE(_T("CDDS_PREERASE\n")); 
                    *pResult |= CDRF_NOTIFYPOSTERASE; 
            break; 
            } 
            case CDDS_POSTERASE: 
            { 
                    TRACE(_T("CDDS_POSTERASE\n")); 
            break; 
            } 
            case CDDS_PREPAINT: 
            { 
                    TRACE(_T("CDDS_PREPAINT\n")); 
                    *pResult |= CDRF_NOTIFYPOSTPAINT; 
            break; 
            } 
            case CDDS_POSTPAINT: 
            { 
                    TRACE(_T("CDDS_POSTPAINT\n"));
                    break; 
            } 
            default: 
            { 
                    TRACE(_T("CDDS_OTHER\n")); 
                    break; 
            } 
        } 
    } 
}

此标题ctrl的唯一目的是在默认绘画上方绘画,因此其中没有太多代码。 CListCtrl派生类的绘制并没有做任何特殊的事情,它让CListCtrl处理OnPaint消息。 CListCtrl派生类确实包含OnCustomDraw部分。但是因为它适用于32位,我怀疑应该在那里搜索问题,另一方面我提到它,因为我没有选择......

我发现了一些类似问题的帖子(只有64位或抽奖活动),但没有一个对我有效。其中一个解决方案是NMCUSTOMDRAW结构的错误定义,但我的是MFC版本,没有找到64位的投诉。另一个原因是由于组件放置的位置没有得到处理,但是它也不应该在32位上工作。其他解决方案特定于处理OnCustomDraw消息和结果,但这对我的测试代码似乎没问题......

亲切的问候,

凯文

0 个答案:

没有答案