- PR -

不定形のフォームを半透明にできない

1
投稿者投稿内容
さらだ
会議室デビュー日: 2003/07/11
投稿数: 17
投稿日時: 2004-03-12 00:59
C#で不定形のフォーム(具体的には角の丸いフォームを作ろうとしています)を作って、
それを半透明表示にしようとしているのですが、どうもうまくいきません。
FormBorderStyleをNoneにして、背景用のイメージ(透明にしたい角の部分を赤に
しました)をBackgroundImageに指定し、Form1_Loadの中で、

this.TransparencyKey = System.Drawing.Color.Red;

としてやると、イメージ通りの角の丸いフォームを表示させることはできるの
ですが、そこにもう1行

this.Opacity=0.5;

を付け加えると、フォームは半透明になりますが、透明になっていた角の部分が
半透明状態で表示されてしまいます。
順番を変えたり色々試したのですが、どうもだめです。ビデオカードの問題か、
.NET Frameworkのバグなのか、同じような経験をされた方はいらっしゃらない
でしょうか?
環境はVisualStudio.NET2003、OSはXP(SP1)、ビデオカードはRadeon9000です。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2004-03-12 01:56
引用:

さらださんの書き込み (2004-03-12 00:59) より:
C#で不定形のフォーム(具体的には角の丸いフォームを作ろうとしています)を作って、



起きている現象への回答ではないのですが、
角の丸いフォームを作りたいのであれば、フォームの(というかコントロールの)Regionプロパティと
GraphicsPathクラスを利用するとよいと思います。
さらだ
会議室デビュー日: 2003/07/11
投稿数: 17
投稿日時: 2004-03-13 09:28
コメントありがとうございます。
なるほど、これで逃げるのが賢明かもしれませんね。
でもどうしてうまくいかなかったんだろ。
バグか、相性か、はたまた仕様か...

引用:

よねKENさんの書き込み (2004-03-12 01:56) より:
引用:

さらださんの書き込み (2004-03-12 00:59) より:
C#で不定形のフォーム(具体的には角の丸いフォームを作ろうとしています)を作って、



起きている現象への回答ではないのですが、
角の丸いフォームを作りたいのであれば、フォームの(というかコントロールの)Regionプロパティと
GraphicsPathクラスを利用するとよいと思います。


Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-15 09:33
 昔、alpha blend(opacity)とTransparentの両方を指定できない、と読んだように思うのですが。

 MSDNで、「opacity transparent」「alphablend transparent」「alpha blend transparent」「opacity」「transparent」「alphablend」をキーに英語の方を検索してみましたが、タイトルからはそのような記事を見つけられませんでした。一応BCB6のヘルプも当たってみましたが、見つけられませんでした。



 その代わりといっては何ですが、VB.NETでopacityを1未満にしたフォームにWebBrowserを貼り付けると、Comptuterがfailするバグがあるらしいです。
http://support.microsoft.com/default.aspx?scid=kb;en-us;306719
さらだ
会議室デビュー日: 2003/07/11
投稿数: 17
投稿日時: 2004-03-15 22:30
引用:

Jittaさんの書き込み (2004-03-15 09:33) より:
 昔、alpha blend(opacity)とTransparentの両方を指定できない、と読んだように思うのですが。

 MSDNで、「opacity transparent」「alphablend transparent」「alpha blend transparent」「opacity」「transparent」「alphablend」をキーに英語の方を検索してみましたが、タイトルからはそのような記事を見つけられませんでした。一応BCB6のヘルプも当たってみましたが、見つけられませんでした。


そこまで調べていただいてありがとうございます。
私の場合、VisualStudioのヘルプを見て、できないとは書いてなかったので、できる
もんだと信じこんでいました。

さしあたり今回の角の丸いフォームについては、よねKENさんにご指摘いただいた
内容を元に、

protected override void OnPaint( System.Windows.Forms.PaintEventArgs e )
{
System.Drawing.Drawing2D.GraphicsPath shape
   = new System.Drawing.Drawing2D.GraphicsPath();
shape.AddLine(2, 0, this.Width-3, 0);
shape.AddLine(this.Width, 2,this.Width,this.Height-3);
shape.AddLine(this.Width-3,this.Height, 2,this.Height);
shape.AddLine(0, this.Height-3, 0, 2);
this.Region = new System.Drawing.Region(shape);
}

というコードをフォームクラスに追加して、ほぼ予定通りのフォームを作る事が
できました(角丸の四角を直接指定するメソッドが見当たらなかったので、角の
欠けた四角を直線4本で作り欠けた部分を.NET Frameworkに補完させて
います)。

とりあえず今回はこれで解決しましたが、もし将来デスクトップを漂う半透明の
クラゲ(なんだそれは)なんてものを作ろうとしたら困ることになりそうですね。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-16 08:59
引用:

さらださんの書き込み (2004-03-15 22:30) より:

(角丸の四角を直接指定するメソッドが見当たらなかったので、角の
欠けた四角を直線4本で作り欠けた部分を.NET Frameworkに補完させて
います)。


 昔、C Magazineあたりの記事で読んだと思うのですが、角を円で4つ、上、下、右、左の「縁」を四角で4つ、真ん中を四角で1つの計9つのシェイプを組み合わせて作っていたように思います。・・・イメージしていただけたでしょうか?

とりあえず、他の言語ですが、いっぱいサンプルがありました。
検索結果

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-03-16 09:00 ]
さらだ
会議室デビュー日: 2003/07/11
投稿数: 17
投稿日時: 2004-03-17 01:49
引用:

Jittaさんの書き込み (2004-03-16 08:59) より:
 昔、C Magazineあたりの記事で読んだと思うのですが、角を円で4つ、上、下、右、左の「縁」を四角で4つ、真ん中を四角で1つの計9つのシェイプを組み合わせて作っていたように思います。・・・イメージしていただけたでしょうか?


なるほど、清く正しい角丸四角はこのように描くのですね。
今回のはごく小さなフォームだったので、私の手抜きコードでもそれっぽく見えている
(もっとも私のは厳密には角丸四角でなく、八角形です)のですが、今後の参考にさせて
いただきます。ありがとうございます。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2004-03-17 02:16
引用:

さらださんの書き込み (2004-03-17 01:49) より:
今回のはごく小さなフォームだったので、私の手抜きコードでもそれっぽく見えている
(もっとも私のは厳密には角丸四角でなく、八角形です)のですが、今後の参考にさせて
いただきます。ありがとうございます。



提示コードでどうやって角丸になるんだろう?と思ってたのですが、
やはり八角形になるコードだったのですね。(試せばわかる話ですが、試す暇がちょっとなかったもので)

できているならいいかと挙げなかったんですが、
PAPA'n VBの3/10のTipsでちょうど角丸の四角形のリージョンを紹介されています。

そちらの場合は、GraphicsPathクラスのAddArcメソッドで角丸部分だけを明示して、
残りの直線を補完させているようです。(これまた、私自身は試してません(^^
1

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