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