TreeViewでノードごとにテキストカラーを変えるには?

解決


彦蔵  2003-04-26 21:00:43  No: 3436  IP: [192.*.*.*]

TreeViewでノードごとにテキストカラーを変えたいのですが
どうすればいいでしょうか?
HELPのTCustomTreeView-OnCustomDrawItemは確認したのですが
フォントの色だけ変更させる方法がよくわかりません。
どなたかご存じの方教えていただけませんか。

編集    削除
にしの  2003-04-26 22:40:59  No: 3437  IP: [192.*.*.*]

TTreeView, TListViewのオーナードロー系イベントにはバグがあるみたいです。
フォントの色の変更だけなら、TreeView1.Canvas.Font.Colorに値を入れればOKです。
が、イベント後、フォントが壊れるらしく、文字が大きくなったりします。

解消方法はいくつかあるようですが、イベント時に
var
  SavedDC: THandle; // 待避用
begin
  SavedDC := SaveDC(TreeView1.Canvas.Handle);
  ...
  TreeView1.Canvasに対する描画
  ...
  RestoreDC(SavedDC);
end;

編集    削除
にしの  2003-04-26 22:42:11  No: 3438  IP: [192.*.*.*]

失礼しました。送信してしまいました。

1つ間違いです。

ReleaseDC(TreeView1.Canvas.Handle, SavedDC);

とすればOKだと思います。

編集    削除
彦蔵  2003-04-26 23:15:28  No: 3439  IP: [192.*.*.*]

にしのさんありがとうございます。
TreeView1.Canvas.Handleをsaveしてreleaseするのはどういう意味でしょう?
またフォントの色を変更するのにTreeView1.Canvas.Font.Colorに色を
セットすると全ノードがその色になってしまいますが、特定のノードに対してだけ有効にするにはどうしたらいいのでしょうか?

編集    削除
彦蔵  2003-04-26 23:50:03  No: 3440  IP: [192.*.*.*]

特定のノードの色だけ変えることができましたが、
やはりにしのさんのご指摘通り、変更したもの以外のフォントサイズが
大きくなってしまいます。
にしのさんのサンプルにあるsaveddc、ReleaseDCを入れたのですが、
変わりません。何か解決策はあるのでしょうか?

編集    削除
にしの  2003-04-27 01:56:09  No: 3441  IP: [192.*.*.*]

ListViewの場合ですが、次の一文を加えると修正できるようです。
with Sender.Canvas do
    if Assigned(Font.OnChange) then Font.OnChange(Font);

http://homepage1.nifty.com/beny/index.html
の、DEVELOPにありまsた。

TreeViewでもたぶん同じだと思います。

編集    削除
彦蔵  2003-04-27 19:40:55  No: 3442  IP: [192.*.*.*]

にしのさんありがとうございました。
確かにTreeViewでもうまくいきました。

編集    削除
にしの  2003-04-28 07:42:10  No: 3443  IP: [192.*.*.*]

今更ですが間違えてました。
ReleaseDCでなく、RestoreDCでいけると思います。
# ReleaseDCはGetDCしたときに「返す」関数です。SaveDCで保存したDCを、「元に戻す」のが、RestoreDCです

編集    削除