none
リストビューコントロールで背景色を変更する方法(”CDDS_ITEMPREPAINT”が来ない) RRS feed

  • 質問

  • いつもお世話になっております。

    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  参照


    2011年3月23日 5:52

回答

  • Comctl32.dll version 6以上を使用しなければなりませんが、
    このあたりは大丈夫でしょうか。指定にはマニフェストファイルを使用します。

    自分の場合、こんな面倒なコードを書くのがうんざりなので、
    LVS_OWNERDRAWFIXEDを使用することに決めてますけどね(vv;)。

    • 回答としてマーク 山本春海 2011年4月19日 8:03
    2011年3月25日 4:55
  • 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
    2011年3月30日 15:51

すべての返信

  • Comctl32.dll version 6以上を使用しなければなりませんが、
    このあたりは大丈夫でしょうか。指定にはマニフェストファイルを使用します。

    自分の場合、こんな面倒なコードを書くのがうんざりなので、
    LVS_OWNERDRAWFIXEDを使用することに決めてますけどね(vv;)。

    • 回答としてマーク 山本春海 2011年4月19日 8:03
    2011年3月25日 4:55
  • ご指導ありがとうございます。

    参考にさせていただいて、やってみます。

    2011年3月27日 1:42
  • 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
    2011年3月30日 15:51