トップ回答者
リストビューコントロールで背景色を変更する方法(”CDDS_ITEMPREPAINT”が来ない)

質問
-
いつもお世話になっております。
VC++6.0、ダイアログベースのプロジェクトに、レポートタイプのリストビューを貼り付けています。
リストビューの指定行の背景色を変更したくて調べたところ、
いろいろなサイトに方法が掲載されており、それに基づいて下記のようにコーディングしてみたのですが、
”CDDS_ITEMPREPAINT”が来ません。(”CDDS_PREPAINT”以外は来ていないようです)
なにか問題はありますでしょうか?
ご教授、よろしくお願いいたします。
BOOL CTestDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
LPNMHDR lpnmhdr;
LPNMLVCUSTOMDRAW lplvcd;
int i=0;
lpnmhdr = (LPNMHDR)lParam;
if(lpnmhdr->idFrom == IDC_LIST1 ){ // IDC_LIST1 ; リストビューコントロールのID
switch( lpnmhdr->code ){
case NM_CUSTOMDRAW:
lplvcd = (LPNMLVCUSTOMDRAW)lParam;
if( lplvcd->nmcd.dwDrawStage == CDDS_PREPAINT ){
SetWindowLong(this->m_hWnd, DWL_MSGRESULT,(long)CDRF_NOTIFYITEMDRAW);
return( TRUE );
}else {
i++; // ここにブレークポイントをセットしましたが止まりませんでした。
}
if( lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT ){
lplvcd->clrTextBk = RGB(0xCC, 0xCC, 0xCC);
SetWindowLong( m_hWnd, DWL_MSGRESULT,(long)CDRF_NEWFONT);
return( TRUE );
}
return( CDRF_DODEFAULT );
}
}
return CDialog::OnNotify(wParam, lParam, pResult);
}※ http://www.h5.dion.ne.jp/~sfsf11/listview/listview.html 参照
回答
-
OSは何でしょうか?
また、これMFCのCodeですよね?SetWindowLongではなく、pResultにCDRF_NOTIFYITEMDRAWをSetしてください。
SetWindowLongはAPIで実装した場合に利用します。if( lplvcd->nmcd.dwDrawStage == CDDS_PREPAINT ){
(*pResult) = CDRF_NOTIFYITEMDRAW;
return true;
}そうすれば、CDDS_ITEMPREPAINTが飛んできます。
Minimum DLL Version comctl32.dll version 4.70 or later ですので、Manifestがなくても動作するはずですよ。- 回答としてマーク 山本春海 2011年4月19日 8:03
すべての返信
-
OSは何でしょうか?
また、これMFCのCodeですよね?SetWindowLongではなく、pResultにCDRF_NOTIFYITEMDRAWをSetしてください。
SetWindowLongはAPIで実装した場合に利用します。if( lplvcd->nmcd.dwDrawStage == CDDS_PREPAINT ){
(*pResult) = CDRF_NOTIFYITEMDRAW;
return true;
}そうすれば、CDDS_ITEMPREPAINTが飛んできます。
Minimum DLL Version comctl32.dll version 4.70 or later ですので、Manifestがなくても動作するはずですよ。- 回答としてマーク 山本春海 2011年4月19日 8:03