リストビューのカスタムドローで、一行全体を塗りつぶすには?

解決


TM  2004-09-16 05:21:14  No: 54504  IP: [192.*.*.*]

VC6,MFCダイアログベースでの製作です。

リストビューのカスタムドローを用いて、ストライプ表示(しましま)を行いたいと思っているのですが、どうも希望通りのしましまにできません。

LPNMLVCUSTOMDRAW lcd=(LPNMLVCUSTOMDRAW)pNMHDR;
  ・・・(省略)・・・
case CDDS_ITEMPREPAINT:
    *pResult = CDRF_DODEFAULT;
    if( lcd->nmcd.dwItemSpec % 2 == 0 ){
        lcd->clrText = RGB(0,0,0);
        lcd->clrTextBk = RGB(240,240,255);
        *pResult = CDRF_NEWFONT;
    }
    break;

と記述し、偶数行の背景に色を持たせているのですが、これではアイテムの背景色しか操作できません。つまり、リストビューの右端部分は塗りつぶせません。これを、リストビュー内の一行全てを塗りつぶすにはどのような手を用いればいいのでしょうか?オーナードローはやりたくないので、カスタムドローで解決したいです。ちなみに、カスタムドローを行うのも初めてです。

どうかご教授お願いいたします。

編集    削除
SG  2004-09-16 20:53:10  No: 54505  IP: [192.*.*.*]

CDDS_SUBITEMでも同じ事をすればいいんじゃないでしょうか?
だめなら
DWORD dwFlag = CDDS_ITEMPREPAINT|CDDS_SUBITEM;
if(lcd->nmcd.dwDrawStage == dwFlag)
{
ストライプ処理
}

ではどうでしょうか?

編集    削除
TM  2004-09-16 21:40:29  No: 54506  IP: [192.*.*.*]

ご返答ありがとうございます。

私の説明が下手なせいか状況をうまく伝えられなかったかもしれません。右端が塗りつぶされないというのは、例えば...

リストビューコントロールの全体の横幅が100だとしましょう。その時、列が4つあり、その横幅(列幅)の合計は80だとしましょう。すると、リストビューの右端に長さ20の"列の無い部分"ができますよね?列がない、つまりアイテムがないので、CDDS_SUBITEMを使ってもアイテムの無い右端部分は結局塗りつぶされないんです。

この状況をうまく解決できることはできないでしょうか。
どうかご教授お願いいたします。

編集    削除
シャノン  2004-09-16 23:06:40  No: 54507  IP: [192.*.*.*]

カスタムドローってのは、ドロー(描き方)のカスタマイズなので
そもそも描けない所をどうこうしようってのが無理かと思われ。
そういう所まで全部面倒見るのがオーナードローっつーんじゃないだろうか。

編集    削除
SG  2004-09-16 23:37:05  No: 54508  IP: [192.*.*.*]

そういうことですか。
ならたぶんシャノンさんの言う通りじゃないかと思います。

オーナードローをしたくないならヘッダー部を動かせなくするしかないかな
と思います。

編集    削除
TM  2004-09-17 00:53:57  No: 54509  IP: [192.*.*.*]

SGさん、シャノンさん、ご返答ありがとうございます。

やはり、カスタムドローでは無理ですか...まだ、私にはオーナードローの記述はよくわからないので今回は諦めます。

>>ヘッダー固定
これをやってしまうとやはり不便になってしまうので諦めます。

ありがとうございました。

編集    削除