- PR -

コントロールの透過について

1
投稿者投稿内容
たく
会議室デビュー日: 2007/06/15
投稿数: 16
投稿日時: 2007-06-15 11:28
はじめまして、よろしくお願いします。
 VS2005
 Windows XP/ Windows Vista

フォームにピクチャボックスを配置しただけの簡単なアプリです。
やりたい事は、ピクチャボックスにBitmapをBackGraundImageとして貼り付け、その画像の黒色部分を透過指定し、透過した部分に見えるアイコンを選択できるようにしたいです。

今は、以下のようにやっています。
   this.TransparencyKey = Color.Black;
   Bitmap bmp = new Bitmap(@"c:\\\\test\\\\image.bmp");
   pictureBox.BackgroundImage = bmp;
   pictureBox.BackColor = Color.Transparent;

こうやると、Vista上では
 ・ピクチャボックスの黒色部分が透過され、アプリの背景のアイコンなどが
  表示されるが、透過してみえるアイコンなどをクリックできない。
  (見た目だけ透過されている。)
で、XP上では、
 ・透過されない
となりました。
コントロールのイメージを透過させる場合、操作まで透過させる事はできないことなのでしょうか?
また、なぜVistaとXPで動作が変わってしまうのでしょうか?
(XP環境には、VS2003しか入れてないからでしょうか?)


ちなみに、フォーム色をthis.TransparencyKeyに指定すると、フォームが透けて、下に見えるアイコンをクリックすることができました。
たく
会議室デビュー日: 2007/06/15
投稿数: 16
投稿日時: 2007-06-15 13:46
追加で質問させてください。

フォームのTransparencyKeyを指定しないでピクチャボックスの指定した色を透過させる事は可能なのでしょうか?
(上記ソースで、TransparencyKeyをコメントアウトすると、画像の黒い部分がフォームの背景色となってしまいました。)


よろしくお願いします。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-06-15 15:36
質問がたくさんありますね。

引用:

Silverさんの書き込みより:
コントロールのイメージを透過させる場合、操作まで透過させる事はできないことなのでしょうか?



できます。

引用:

また、なぜVistaとXPで動作が変わってしまうのでしょうか?



Aero等が関与して、Formの振る舞いが変わる場合があるかもしれませんが、
それに関しての情報は私は持っていません。

少なくとも、TransparencyKeyの振る舞いは.Net1.1と.Net2.0で異なります。
今回の相違の原因はFrameworkのバージョンです。

.Net1.1の方がWindowsネイティブに近い振る舞いです。
.Net2.0では追加コードが入っているようです。

引用:

フォームのTransparencyKeyを指定しないでピクチャボックスの指定した色を透過させる事は可能なのでしょうか?



可能です。

上記二つの操作透過の件ですが、
他のスレッドでも解答したことがありますが、
1、RegionやLayeredWindowsを使う方法
2、WndProcとヒットテストを使う方法
3、がんばって下の色を調べて自分でWindowsメッセージを送る方法
4、その他の方法
の4通りがあります。
3と4の方法はお勧めしません。

この手の問題はWin32のWindow関係を知らないと
うまくできないので、
それを調べるといいでしょう。
たく
会議室デビュー日: 2007/06/15
投稿数: 16
投稿日時: 2007-06-15 16:15
回答ありがとうございます。

調べていたところ、
 ・http://support.microsoft.com/kb/822495/
にあるように、PCの色深度が24ビット以上の場合TransparencyKeyが正常に動作しないみたいです。
試しに、XPの方のPCの色深度を16ビット(元は32ビットでした。)にしたら、正常に透過処理されました。
(透過部分をクリックしたら、クリックしたアプリがアクティブになる。)
同様に、Vistaの方のPCも色深度を16ビットにしたら、透過部分をクリックしたら、クリックしたアプリがアクティブになりました。

つまり、
 Vista環境で色深度が32ビットの場合
  透過色になるが、透過部分をクリックしても自アプリがアクティブのまま
 XP環境で色深度が32ビットの場合
  透過色にならない
って結果になりました。


れいさんが提示してくれた方法に、TransparencyKeyを使わない方法もありましたので、そちらの方法も調べてみます。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-06-15 17:20
引用:

調べていたところ、
 ・http://support.microsoft.com/kb/822495/
にあるように、PCの色深度が24ビット以上の場合TransparencyKeyが正常に動作しないみたいです。



そうでした。そんな話もありましたね。
24bit以下で使うことがないので
TransparencyKeyの振る舞いはこれが普通だという認識になってしまっていました。

引用:

つまり、
 Vista環境で色深度が32ビットの場合
  透過色になるが、透過部分をクリックしても自アプリがアクティブのまま
 XP環境で色深度が32ビットの場合
  透過色にならない
って結果になりました。



これは
Vista with .Net2.0
XP with .Net1.1
ですよね?

.Net1.1と2.0でTransparencyKeyの振る舞いが違うのも事実ですので、
もしよろしければ、同じコードで
Vista with .Net1.1
XP with .Net2.0
を試していただけるとうれしいです。
どうなるんでしょうか?

OSは関係ないという結論を期待しているんですが。
たく
会議室デビュー日: 2007/06/15
投稿数: 16
投稿日時: 2007-06-15 18:25
回答ありがとうございます。

引用:

これは
Vista with .Net2.0
XP with .Net1.1
ですよね?


そうです。
でも、XPのPCにはVS2003をインストールしていますが、別途Framework2.0もインストールしていました。
(「プログラムの追加と削除」に表示されています。)


引用:

.Net1.1と2.0でTransparencyKeyの振る舞いが違うのも事実ですので、
もしよろしければ、同じコードで
Vista with .Net1.1
XP with .Net2.0
を試していただけるとうれしいです。
どうなるんでしょうか?


せっかくなので確認したいのですが、今は環境を混在させたくないんです。すいません。。。
時間があれば確認してみます。


いろいろ情報ありがとうございましたm(__)m
1

スキルアップ/キャリアアップ(JOB@IT)