64 ビット マシンで NM_CUSTOMDRAW メッセージを処理するときに、いくつかの問題に直面しています。CHeaderCtrl 派生ヘッダー (PreSubclassWindow 経由でリンク) を持つ CListCtrl 派生クラスがあります。
CHeader 派生クラスでは、いくつかのカスタム ペイントを行います。これは 32 ビット ビルドで機能します。しかし、64 ビット版をビルドすると、ドローステージは 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ビットまたはドローステージのみが残っている)を含む投稿をいくつか見つけましたが、どれもうまくいきませんでした。これらの解決策の 1 つは NMCUSTOMDRAW 構造体の誤った定義でしたが、私のものは MFC バージョンであり、64 ビットに対する苦情は見つかりませんでした。もう 1 つの問題は、コンポーネントが配置された場所が原因で結果が処理されなかったことですが、32 ビットでも動作しないはずです。他のソリューションは、OnCustomDraw メッセージと結果の処理に固有のものですが、それは私のテストコードでは問題ないようです...
敬具、
ケビン