- - PR -
不定形のフォームを半透明にできない
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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です。 | ||||||||
|
投稿日時: 2004-03-12 01:56
起きている現象への回答ではないのですが、 角の丸いフォームを作りたいのであれば、フォームの(というかコントロールの)Regionプロパティと GraphicsPathクラスを利用するとよいと思います。 | ||||||||
|
投稿日時: 2004-03-13 09:28
コメントありがとうございます。
なるほど、これで逃げるのが賢明かもしれませんね。 でもどうしてうまくいかなかったんだろ。 バグか、相性か、はたまた仕様か...
| ||||||||
|
投稿日時: 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 | ||||||||
|
投稿日時: 2004-03-15 22:30
そこまで調べていただいてありがとうございます。 私の場合、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に補完させて います)。 とりあえず今回はこれで解決しましたが、もし将来デスクトップを漂う半透明の クラゲ(なんだそれは)なんてものを作ろうとしたら困ることになりそうですね。 | ||||||||
|
投稿日時: 2004-03-16 08:59
昔、C Magazineあたりの記事で読んだと思うのですが、角を円で4つ、上、下、右、左の「縁」を四角で4つ、真ん中を四角で1つの計9つのシェイプを組み合わせて作っていたように思います。・・・イメージしていただけたでしょうか? とりあえず、他の言語ですが、いっぱいサンプルがありました。 検索結果 [ メッセージ編集済み 編集者: Jitta 編集日時 2004-03-16 09:00 ] | ||||||||
|
投稿日時: 2004-03-17 01:49
なるほど、清く正しい角丸四角はこのように描くのですね。 今回のはごく小さなフォームだったので、私の手抜きコードでもそれっぽく見えている (もっとも私のは厳密には角丸四角でなく、八角形です)のですが、今後の参考にさせて いただきます。ありがとうございます。 | ||||||||
|
投稿日時: 2004-03-17 02:16
提示コードでどうやって角丸になるんだろう?と思ってたのですが、 やはり八角形になるコードだったのですね。(試せばわかる話ですが、試す暇がちょっとなかったもので) できているならいいかと挙げなかったんですが、 PAPA'n VBの3/10のTipsでちょうど角丸の四角形のリージョンを紹介されています。 そちらの場合は、GraphicsPathクラスのAddArcメソッドで角丸部分だけを明示して、 残りの直線を補完させているようです。(これまた、私自身は試してません(^^ |
1