DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォームの半透明について

環境/言語:[.NET C#]
分類:[.NET]

はじめまして。
宜しくお願い致します。

さて、C#になってから、標準でフォームの透過処理や半透明が実現できるようになって少しだけ便利になったと喜んでいるのですが、ただ一つどうしても方法が判らない問題が発生しました。
例えば、フォームにピットマップを貼り付けて、異形フォームを作っていますが、そこで半透明を指定すると、本来透明になってほしい外側まで半透明で表示されてしまいます。
完全な透明のときは、きちんと異形フォームになるのですが、半透明にすると本来の四角いフォームのままで半透明になります。
異形フォームのまま半透明にする方法を教えて下さいませ。

上記件、宜しくお願いいたします。
> 異形フォームのまま半透明にする方法を教えて下さいませ。

こんにちは。

このような場合はこちらのTipsでも紹介されている
「フォームやコントロールの形を変える」のようにFormの
Regionを変更する方法があります。任意のBitmapなどに
対応するためには、まず、背景色などの情報からその
BitmapのGraphicsPathを作成する必要があるでしょう。
TransparencyKeyに何色を指定していますか?黒や白などではうまく行くかもしれません。
こんにちは、出張中先からの書き込みだったので、お返事が遅くなりました。
申し訳ありません。


> このような場合はこちらのTipsでも紹介されている
> 「フォームやコントロールの形を変える」のようにFormの
> Regionを変更する方法があります。任意のBitmapなどに
> 対応するためには、まず、背景色などの情報からその
> BitmapのGraphicsPathを作成する必要があるでしょう。

Bitmapの複雑な形状に対して、どこまでRegionが使用可能か判りませんので
勉強してみます。
ありがとう御座いました。
こんにちわ。

> TransparencyKeyに何色を指定していますか?黒や白などではうまく行くかもしれません。

一応、黒と、白を試しましたが、透過と半透明の設定を同時には使えませんでした。
> 一応、黒と、白を試しましたが、透過と半透明の設定を同時には使えませんでした。

私の環境では、できているようなのですが。

http://dobon.net/vb/dotnet/form/transparencykey.html

と同じやり方ですよね?
お世話になります。

>
> http://dobon.net/vb/dotnet/form/transparencykey.html
>
> と同じやり方ですよね?

あれ〜?
違うところと言えば、半透明にする為に、Opacityを使用しているくらいしか
違いがないような。

どうしても、半透明にすると、透明に設定した部分の透過が解除されて半透明に
なってしまいます。
これじゃ異型フォームのフェードイン、フェードアウトができないなぁ・・・。
ぅぅ困った。

最悪、教えていただいたURLのサンプルをパクって、動作確認したら
流用するって手もありますが、それじゃ原因の解決にならないし。

半透明と透明は同時に設定出来ないのでは?とも聞いた事あるし。
この噂は本当かな。
もしかして、私が思っているのと違うことなのか、それとも私が幻を見ているのでしょうか?

一応コードを載せます。2.bmpは白地に黒丸だけの、2色の画像です。

private Bitmap bmp;

//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, System.EventArgs e)
{
bmp = new Bitmap("2.bmp");
this.FormBorderStyle = FormBorderStyle.None;
this.Width = bmp.Width;
this.Height = bmp.Height;
this.BackColor = Color.White;
this.TransparencyKey = Color.White;
this.Opacity = 0.5;
}

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);
}

結果は、こんな感じです。

http://dobon.net/cgi-bin/up/files/002.png
お世話になります。
ども。

> 一応コードを載せます。2.bmpは白地に黒丸だけの、2色の画像です。
>

一応、新規でプロジェクトを作成してコードをコピペして、画像だけこっちのに
変更して実行しました。
ガーン・・・やっぱ透過と半透明は同時に実現出来ませんでした。
白を透過に設定したのですが、50%の半透明となってしまいますね。
もしかしたら、画像に問題があるのかな?
普通に作った1677万色のビットマップなんですが・・・。
(実際は3色だけしか使用していないビットマップです)

参考の画像を拝見させて頂きましたが、どの部分が半透明に設定されて
いるのでしょうか?
>参考の画像を拝見させて頂きましたが、どの部分が半透明に設定されて
>いるのでしょうか?

当然、黒丸の部分です。

私の環境はWin2000なのですが、XPだとだめなのかと思い試したところ、思ったとおりにだめでした。単純にOSの違いだけかどうかはわかりませんが、環境により違うようですね。失礼しました。
お世話になります。

> 私の環境はWin2000なのですが、XPだとだめなのかと思い試したところ、思ったとおりにだめでした。単純にOSの違いだけかどうかはわかりませんが、環境により違うようですね。失礼しました。

ガ〜ン・・・そうなんですか・・・。
調べて頂いてありがとうございます。
私の方でも Win2000 で動作するか帰ったら検証してみます。

私は普段、Win2000上で作成しているのですが、今回はたまたま偶然、XPで作成したんですよ。 うかつでした。
でも、最初からWin2000で開発して、それで完成させて、いざ XP って時に動作が違って
いたらと思うと、この違いが明らかになって良かった気がします。
って言うか、Win2000 で出来てたのに、何故、XP で機能を落とす必要があるのかなぁ。

ちょっち諦めきれませんね。
DirextX でも使ったら何とかなるのかなぁ?

VB 用の OCX で、tsLayeredCtrl.ocx ってフリーのコントロールがあるんですけれど
コイツが、透過と半透明を同時使用出来るんですよ。
XP でも Win2000 でも動作確認しているんですよ。
でも、私、VB から C# に乗り換えちゃったから使用出来なくなって、で、変わりに
C#の機能でなんとかならないのかと頑張ってみました。
C# で、tsLayeredCtrl.ocx を貼り付けようとすると、なんだかエラーでるし。
...とおもったのですが、XPでもできました。

bmp.MakeTransparent(Color.White);

を加えたところ、うまく行きました。exeファイルをアップロードしておきますので、そちらの環境でも大丈夫か試してみてください。

http://dobon.net/cgi-bin/up/files/003.zip
お世話になります。
ありがとう御座います。
実は、こちらでも昨晩同じ方法で、実現していました。
ただ、こちらの方法が逆に Win2000 で動かなかったらシャレに
ならないんで、報告を控えておりました。

試しに、
もう一枚他のビットマップを貼り付けて、まったく違う別の色を
透過色に設定してやると、指定した色だけ透過して他の色は
半透過になりました。
つまり、基本的に全体が半透過の状態で、透過する色が複数設定
されたフォームも作成出来ます。

今回は結構難しかったですね。

> ...とおもったのですが、XPでもできました。
>
> bmp.MakeTransparent(Color.White);
>
> を加えたところ、うまく行きました。exeファイルをアップロードしておきますので、そちらの環境でも大丈夫か試してみてください。
>

ありがとう御座いました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板