vista sp1
vc2008 Express Edition
sdk
以前、
リストビュー(レポート)をカスタムドローで表示しています。
LVS_EX_FULLROWSELECTで一行選択にしているんですが、アイコンの背景色だけが変化しま
せん。
どうすればいいのでしょうか?
という質問に
・アイコンファイルの背景色を、「画面の色(透過)」から、「反転色」に塗りなおし
・CImageListのILC_MASKをはずす。
との回答をいただいたのですが、
その表示したいアイコンがアプリケーションに関連づけられているようなものの場合(ア
イコンの編集ができない)、どうすれば、アイコンの背景色を選択色にできるのでしょうか?
ご回答よろしくお願いします。
透過アイコン
透過アイコンをどうすればいいのでしょうか?
あらゆる画像を等質に扱いたい場合の定石は、当該の画像を
一旦メモリーDCに選択したビットマップにすることです。
しかる後に、そのビットマップの特定色を指定して透過
描画すれば、ご希望の機能が実現します。
具体的には
1.メモリーDCとそれに選択したビットマップを用意
2.あらかじめ当該アイコンをこのDCに描画(DrawIcon())しておく
3.描画(OnDrawかな)時、対象DCに上記DCを透過描画する。
MFCが使用できるならCImageを使うともう少し手順を
省略できますが、原理は似たようなものです(たぶん)。
アイコンは
a、透過マスクを使用して背景を透過
b、各ピクセルに設定されたα値に沿って背景とブレンド
の2種類の方法で背景透過を実現している。
> ・CImageListのILC_MASKをはずす。
ImageListに ILC_MASK が指定されていない場合、アイコンイメージを ImageList に追加
する際に a が持っていた透過マスクは破棄される。
この時点で”何処其処のピクセルを透過する”という情報は捨てられているので、以降背景
を透過も糞も無くなる。
> アイコンの背景色だけが変化しません
よって↑の結果となる。
ImageList が 32-bit 形式Bitmapで無い場合、アイコンイメージを ImageList に追加す
る際に b が持っていたα情報は破棄される。
この時点で”背景に対して何%割合でブレンドする”という情報は捨てられているので、以
降背景とブレンドも糞も無くなる。
> アイコンの背景色だけが変化しません
よってこちらも↑となる。
また、VC++ではマニフェストで指定しないと古いコモンコントロール(ImageList)が使
用される。(VC9でどうなのかはあまり自信無い)
この古い(comctl32 ver6 より前) ImageList コントロールはαチャンネルに対応してい
ない。そのため ImageList に追加したアイコンがαチャンネルを含んでいてもαは無視さ
れる。
> アイコンの背景色だけが変化しません
よってこの場合も↑となる。
解法参考ページ
http://kwikwi.cocolog-nifty.com/blog/2006/05/bcb_listview32b_14c8.html
ヤマを張って回答した感もあるので、この回答がnfsさんの求めているものとなるかどう
かは判んない。
たしか、nfsさんがいってるのは
単に
「背景を透過させたい」
ってことではなく
「通常時は背景は透過だが、選択時には、背景部分も反転色に変わる」
というアイコン
透過アイコンに対していうなら、反転色アイコンという感じかな
#通常の透過アイコンでは、選択時にも背景が透過したまま
こっちの状態のモノを使うには
>・アイコンファイルの背景色を、「画面の色(透過)」から、「反転色」に塗りなおし
>・CImageListのILC_MASKをはずす。
という流れが必要だった
で、今回は、
「自分でアイコンのデータをいじれない(すでに背景に透過色が設定されている)ものを
強制的に反転色アイコンとして扱いたい」
ってところでしょうか
と、ここまで書いたけど、すいません、私はその方法わかりませんでした。
イメージリストのCreate時やアイコンのロード時に、なんか専用のフラグを立てることで
どうにかなるような問題ではなく
読み込んだアイコンデータをいじくる必要があるのではないかと思います。
>「自分でアイコンのデータをいじれない(すでに背景に透過色が設定されている)ものを
> 強制的に反転色アイコンとして扱いたい」
↑その通りです。
みなさん、ご回答ありがとうございます。
リストコントロールをオーナードローすればできるような感じがするのですが、
リストを普通に表示又はカスタムドローでは私のやりたいことはできないのでしょうか?
(リストコントロールのオーナードローはやったことないです。)
うーん、リストにアイコンを表示して一行選択したいだけなのに・・・そんなにややこし
いのかな。><
Windows Vista 限定で、リストビュー作成時に
SetWindowTheme(hwndlv, Lexplorer, NULL);