1

在 64 位机器上处理 NM_CUSTOMDRAW 消息时,我遇到了一些麻烦。我们有一个带有 CHeaderCtrl 派生标头的 CListCtrl 派生类(通过 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; 
            } 
        } 
    } 
}

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

我发现了一些具有类似问题的帖子(仅保留 64 位或 drawstage),但没有一个对我有用。其中一个解决方案是 NMCUSTOMDRAW 结构的错误定义,但我的是 MFC 版本,没有发现 64 位的投诉。另一个是由于组件的放置位置,结果没有得到处理,但它也不应该在 32 位上工作。其他解决方案专门用于处理 OnCustomDraw 消息和结果,但这对我的测试代码来说似乎很好......

亲切的问候,

凯文

4

0 回答 0