>リストビューのプロパティをいじったのであればその情報がほしいです。
これをうけてプロパティーを見たのですが、
『オーナー描画固定』にチェックが入ってました。
このチェックをはずしたらしななくなりました。(^o^)/
>で、将来的にカスタムドローかオーナドローをするようなんですが、そこら辺の情報も
>ください。
この辺の話はよく意味がわからないのですが・・・
リストコントロールに表示したいだけです。
> この辺の話はよく意味がわからないのですが・・・
> // 行の背景色を設定する
ってことは、リストビューの背景色を変えたいということですよね?
item.lParamに色の情報を設定するだけでは、デフォルトのCListCtrlは何もしてくれま
せん。自前で、lParamの値をみて色をつける必要があります。
以前似たような質問を解答したことがあるので参考に載せておきます。
http://www2.moug.net/bbs/program/20060302000002.htm
上記WEBの説明では、
NM_CUSTOMDRAWを追加しろとのことですが、ないのですが・・・
他のやり方はないのでしょうか?
InsertItemをする前に
設定するのでしょうか?
> NM_CUSTOMDRAWを追加しろとのことですが、ないのですが・・・
VC6だとないですね。面倒ですが手動で入れるしかないです。
手動でいれる方法は、こちらを参考にどうぞ
http://www24.cds.ne.jp/~neg/pro/piyo1/clc/custom.html
>手動でいれる方法は、こちらを参考にどうぞ
> http://www24.cds.ne.jp/~neg/pro/piyo1/clc/custom.html
他にもっと簡単にできる方法はないですかね?
大差ないのでは?
新しいVCを買えば設定は多少は楽になるかもしれませんが、VC自体の習熟はもっと大変かも。
後は出来合を探して導入するとか、発注するとか。結局、別の手間(と予算)がかかるでしょう。
CString に関しては、
item.pszText = const_cast< CString::PXSTR >( static_cast< CString::PCXSTR >(
str ) );
でよかとですよ。
VC++に関しては融通が利くし、色々細かい制御ができる代わりに
手間はそれなりにかかる物になっていると思います。
なので、使う方がそれなりに習熟する必要があるわけです。
この辺の話はトレードオフなので細かい制御を諦めて標準の動作で我慢するのか
勉強してでも細かい制御ができるようにマスターするのかの何れかでしょう。
なんにしても良くわからないで使うのが一番問題があるので
そこのところはなんとしてもきちんと納得いくまで調べるなり、
デバッグするなりしましょう。
良くわからないけれど動いているからいいやが一番怖いです。
>手動でいれる方法は、こちらを参考にどうぞ
> http://www24.cds.ne.jp/~neg/pro/piyo1/clc/custom.html
この通りに実行したら、
背景色を変更することができました。
ただし、
これだと4列(作成した列は4列)までで
5列目以降は変化しませんでした。
> ただし、
> これだと4列(作成した列は4列)までで
> 5列目以降は変化しませんでした。
どのようなコードを書いているのかワカリマセンが、
プログラムは記述したとおりにしか動きません。そういう記述をしているのでしょう。
(エスパーじゃないからこれだけではワカランでしょ。)
>item.pszText = const_cast< CString::PXSTR >( static_cast< CString::PCXSTR >(
>str ) );
PXSTR と PCXSTR
には何が入るのでしょうか?
>どのようなコードを書いているのかワカリマセンが、
>プログラムは記述したとおりにしか動きません。そういう記述をしているのでしょう。
こんな記述です。
void CLogControlDlg::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMLVCUSTOMDRAW lcd=(LPNMLVCUSTOMDRAW)pNMHDR;
switch( lcd->nmcd.dwDrawStage ){
case CDDS_PREPAINT :
*pResult = CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
lcd->clrTextBk = lcd->nmcd.lItemlParam;
*pResult = CDRF_NEWFONT;
break;
default:
*pResult = CDRF_DODEFAULT;
break;
}
}
類似スレ
■ リストビューのカスタムドローで、一行全体を塗りつぶすには?
http://homepage1.nifty.com/MADIA/vc/vc_bbs/200409_04090038.html
で、「カスタムドローでは不可能」という結論に至っているようです。
オーナードローするしかないですかねぇ。。。(カスタムドローに比べてカナリ面倒)
>オーナードローするしかないですかねぇ。。。(カスタムドローに比べてカナリ面倒)
う~ん・・・仕様でそうせざるをえないか、あるいは時間に余裕があれば、
オーナードローでやってみます。。。
少し前の話になりますが気になったもので。
>item.pszText = str.GetBufferSetLength( str.GetLength() );
>m_LstCtl_Ctrl.SetItem(&item);
>str.ReleaseBuffer();
>のほうがよさそうだけど。
MSNDには
【GetBuffer 関数から返されたポインタを使って文字列の内容を変更するときは、次に
任意の CString メンバ関数を使う前に、ReleaseBuffer 関数を呼び出す必要がありま
す。】
と記述されてますが、
文字列の内容を変更しない時は、
ReleaseBufferはする必要がないということなのでしょうか?
> PXSTR と PCXSTR
> には何が入るのでしょうか?
そのまんま。PXSTR と PCXSTR です。コピペで通りませんか?
…VC++ 6 だと通らないかなぁ。だったらゴメン。
そのままコピペでエラーが出るようであれば、
item.pszText = const_cast< LPTSTR >( static_cast< LPCTSTR >( str ) );
で。
> MSNDには
> 【GetBuffer 関数から返されたポインタを使って文字列の内容を変更するときは、
> 次に任意の CString メンバ関数を使う前に、ReleaseBuffer 関数を呼び出す
> 必要があります。】
> と記述されてますが、
> 文字列の内容を変更しない時は、
> ReleaseBufferはする必要がないということなのでしょうか?
そもそも、GetBuffer は文字列の内容を変更するために使うものでしょう。