リストビューでアイコンの背景色が変わらない2 – プログラミング – Home

リストビューでアイコンの背景色が変わら...
 
通知
すべてクリア

リストビューでアイコンの背景色が変わらない2


nfs
 nfs
(@nfs)
ゲスト
結合: 16年前
投稿: 48
Topic starter  

vista sp1
vc2008 Express Edition
sdk

以前、
リストビュー(レポート)をカスタムドローで表示しています。
LVS_EX_FULLROWSELECTで一行選択にしているんですが、アイコンの背景色だけが変化しま
せん。
どうすればいいのでしょうか?
という質問に
・アイコンファイルの背景色を、「画面の色(透過)」から、「反転色」に塗りなおし
・CImageListのILC_MASKをはずす。
との回答をいただいたのですが、
その表示したいアイコンがアプリケーションに関連づけられているようなものの場合(ア
イコンの編集ができない)、どうすれば、アイコンの背景色を選択色にできるのでしょうか?

ご回答よろしくお願いします。


引用解決済
トピックタグ
焼肉定食
 焼肉定食
(@焼肉定食)
ゲスト
結合: 15年前
投稿: 2
 

透過アイコン


返信引用
nfs
 nfs
(@nfs)
ゲスト
結合: 16年前
投稿: 48
Topic starter  

透過アイコンをどうすればいいのでしょうか?


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

あらゆる画像を等質に扱いたい場合の定石は、当該の画像を
一旦メモリーDCに選択したビットマップにすることです。
しかる後に、そのビットマップの特定色を指定して透過
描画すれば、ご希望の機能が実現します。

具体的には
1.メモリーDCとそれに選択したビットマップを用意
2.あらかじめ当該アイコンをこのDCに描画(DrawIcon())しておく
3.描画(OnDrawかな)時、対象DCに上記DCを透過描画する。

MFCが使用できるならCImageを使うともう少し手順を
省略できますが、原理は似たようなものです(たぶん)。


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

アイコンは
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さんの求めているものとなるかどう
かは判んない。


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

たしか、nfsさんがいってるのは

単に
「背景を透過させたい」
ってことではなく

「通常時は背景は透過だが、選択時には、背景部分も反転色に変わる」
というアイコン

透過アイコンに対していうなら、反転色アイコンという感じかな
#通常の透過アイコンでは、選択時にも背景が透過したまま

こっちの状態のモノを使うには
>・アイコンファイルの背景色を、「画面の色(透過)」から、「反転色」に塗りなおし
>・CImageListのILC_MASKをはずす。
という流れが必要だった

で、今回は、

「自分でアイコンのデータをいじれない(すでに背景に透過色が設定されている)ものを
 強制的に反転色アイコンとして扱いたい」

ってところでしょうか

と、ここまで書いたけど、すいません、私はその方法わかりませんでした。
イメージリストのCreate時やアイコンのロード時に、なんか専用のフラグを立てることで
どうにかなるような問題ではなく
読み込んだアイコンデータをいじくる必要があるのではないかと思います。


返信引用
nfs
 nfs
(@nfs)
ゲスト
結合: 16年前
投稿: 48
Topic starter  

>「自分でアイコンのデータをいじれない(すでに背景に透過色が設定されている)ものを
> 強制的に反転色アイコンとして扱いたい」

↑その通りです。

みなさん、ご回答ありがとうございます。
リストコントロールをオーナードローすればできるような感じがするのですが、
リストを普通に表示又はカスタムドローでは私のやりたいことはできないのでしょうか?
(リストコントロールのオーナードローはやったことないです。)

うーん、リストにアイコンを表示して一行選択したいだけなのに・・・そんなにややこし
いのかな。><


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

Windows Vista 限定で、リストビュー作成時に
SetWindowTheme(hwndlv, Lexplorer, NULL);


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました