前回はお世話になりました。
また、お聞きしたいことが・・・。
メイン画面に左ツリービューと右リストビューを載せていて、それぞれの背景色を変え
たのですが、ともにアイコン周りや文字周りといった部分のみが変わらず、マンダラで
みっともない状態となっています。
一応、
http://www.expertmg.co.jp/html/cti/vctips/control.htm#TreeViewコントロールの背
景色を変える・その1
などを参考にして、きれいに背景色を変えれるように試みたのですが、ダメでした。何
かいい方法はないでしょうか。よろしくお願いします。
環境→WinXP
VC++.NET
SDK
参考にしたホームページで文字の背景色を変えているところがありますが、
その部分は適切に変更されているのでしょうか?
あのままだと単に黒字に白で描画されてしまうと思いますけれど。
どこまで参考にしてどこまで変更しているのかわからないのでコメントのつけようが無いです。
ちょっと説明のしかたが悪かったので説明し直します。
(ツリービューの場合)
・WM_CREATE のところでツリービューを作成した後に、
TreeView_SetBkColor( hTree, RGB(r,g,b));
でツリービュー全面を淡い青色に設定し直したのは良いのですが、
ツリービューに表示された
① アイコン周辺
② 文字周辺
では淡い青色にはならずにシステムカラーのままとなっています。
それで、システムカラーの部分も淡い青色となるように、前記 http://~を参考にし
て下記のようにウィンドウスタイルの付け直しをしてみました。
// ツリービューコントロールの現在のウィンドウスタイルを取得
lStyle = GetWindowLong(hTree, GWL_STYLE );
lStyle &= ~( TVS_HASLINES | TVS_HASBUTTONS |TVS_EDITLABELS );
// 一度ウィンドウスタイルを外す
SetWindowLong( hTree, GWL_STYLE, lStyle );
// ウィンドウスタイルを指定
lStyle |= ( TVS_HASLINES | TVS_HASBUTTONS | TVS_EDITLABELS);
// もう一度ウィンドウスタイルを設定
SetWindowLong( hTree, GWL_STYLE, lStyle );
それでもダメだったのですが、やり方に問題があるのでしょうか。それとも参考例
の選択に誤りがあったのでしょうか。よろしくお願いします。
> ① アイコン周辺
>
について気になるところが。
多分イメージリストを使っていると思いますが、
背景の白色も含めたビットマップを使っていませんか?
SetBkColorは文字の背景色だったと思うのでアイコンの背景色とは無関係でしょう。
アイコンの場合は透過色になっていれば、背景色が出てくるはずですけれど、
sugarさんの指摘のようにきちんと透過できる状態でアイコンが作成されているか
確認した方がいいと思いますよ。
ちなみにイメージリストを作成する時に、ILC_MASKを指定していないと透過にならなかったと
思います。
ダイアログベースの簡単なテストプログラムで
「コントロールの背景色を変える・その1」
を確認したところ、特に問題無くうまく行きました。
ボタンと線の色までは変わっていませんでしたが、文字とボタンの中の+と-は
設定した色で描画されています。
背景色も文字の背景色とツリーコントロールの背景色も一気に変わりましたから、
全く手間いらずでした。
背景色の方はコントロールの背景色を変えるコードを書かないと駄目かと思ってましたから。
sugarさん、PATIOさん、ありがとうございます。PATIOさん、お手数おかけし
て恐縮です。
ツリービュー、リストビュー共に表示されているのはシステムイメージリストからのも
ので、どうもシステムアイコンの透過されるはずの部分(絵の周辺部分)にシステムカ
ラーが出てきているような感じがします。文字自身の背景色もそのような感じがしま
す。このような場合はどう考えてどう対処したらいいのでしょうか。
もう少し自分なりに調べてみます。何か心当たりがありましたら、よろしくお願いし
ます。
こんにちは。半分解決しました!
リストビュー内の文字の背景色は、ListView_SetTextBkColor関数でOK!でした。
あとはツリービュー内のシステムアイコン周りの色を変えるだけですが、これが調べて
も・・・。以上、中間報告でしたぁっー。
こんばんは、
私も初心者なので適切な回答では無いのかもしれませんが、
MFCの場合(私はMFCで勉強しているので)
// 背景色変更
m_wndTree.SetBkColor( RGB(0, 255, 255) );
// イメージリストの作成
m_TreeImgList.Create( IDB_BITMAP1, 16, 0, RGB(192, 192, 192) );
// ツリーのイメージリストの登録
m_wndTree.SetImageList( &m_TreeImgList, TVSIL_NORMAL );
// 項目の追加
HTREEITEM hRoot = m_wndTree.InsertItem( ルート, 0, 0, NULL );
HTREEITEM hChild_1 = m_wndTree.InsertItem( 第一子, 1, 1, hRoot );
HTREEITEM hChild_2 = m_wndTree.InsertItem( 第二子, 1, 1, hRoot );
// ルートを展開
m_wndTree.Expand( hRoot, TVE_EXPAND );
のソースをOnInitDialogに記述して出来ています。
IDB_BITMAP1はツールバーのビットマップをコピーして使用しているので、
表示させるアイコンの背景色はグレー(R:192, G:192, B:192)なので
イメージリストを作成するときにRGB(192, 192, 192)でマスクの設定をしています。
なので、アイコンの背景色 と イメージリストを作成するときのマスクカラー
を同じにすれば実現できるのではないでしょうか。
環境
WIN2000: SP2
VC6,0 : SP5
不適切な回答だったら無視してください。
無事に解決しました!!!
ナオーバ さん、どうもありがとうございました。ImageList_SetBkColor関数でアイコン
の透過部分の色を初期設定することができました。
みなさん、こらからもよろしくお願いします。