在 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 消息和结果,但这对我的测试代码来说似乎很好......
亲切的问候,
凯文