■56108 / inTopicNo.13) |
Re[9]: ボタンを透明にしたい |
□投稿者/ 魔界の仮面弁士 (2001回)-(2010/12/28(Tue) 10:00:04)
|
■No56023 (まっさ さん) に返信 > 透明ボタンって作れるのでしょうか? > transparentに設定しても、なんか枠だけ残ってしまいます。 > 枠を消すプロパティが無いような気が・・・ 枠だけの問題なら、Region プロパティで切り取ってしまうという手も。
■No56099 (borland さん) に返信 > SetWindowLong(Handle, GWL_EXSTYLE, > GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED); > SetLayeredWindowAttributes(Handle, 0, 120, LWA_ALPHA); > APIでできませんか? ウィンドウに半透明効果を追加しようという意図かと思いますが、 レイヤードウィンドウはトップレベルウィンドウを対象にしているので、 「TopLevel = true な Form」には使えますが、それ以外の Control には 使えないはずです。
仮に、元のフォームの手前に透明フォームを表示しておくような意図だとしても、 上記の処理は『form2.Opacity = 120.0 / 255.0;』というコードで表せますので、 API の出番は無いはずです。グラデーションのかかった半透明化などでは必要ですが。 http://www.ipentec.com/document/document.aspx?page=csharp-winform-layerd-window-create
■No56106 (shu さん) に返信 > ボタンを置いて後ろのコントロールを見えるようにするというを想像してたんですが、 既存のコントロール群の上に透明のシートをかぶせるようなイメージでしょうか。 マウスやタブレット操作に限定してよければ、Microsoft.Ink.InkOverlay クラスを被せておき、 そちらのイベントで制御する手もあります。 inkOverlay1 = new Microsoft.Ink.InkOverlay(); inkOverlay1.AttachedControl = this; inkOverlay1.AttachMode = InkOverlayAttachMode.InFront; inkOverlay1.DynamicRendering = false; inkOverlay1.EditingMode = InkOverlayEditingMode.Ink; inkOverlay1.Enabled = true; //イベントとしては、Stroke, NewPackets, NewInAirPackets 等
> そういうことではなかったようで。それともこのことがPictureBoxで出来るのでしょうか? できないのでは無いでしょうか。背面にあるコントロールの描画処理を PictureBox 側で 肩代わりするような実装にできれば表現できそうですが、汎用的にする方法を思いつきません。
先のレイヤード ウィンドウ案でいくならば、透明度の高い別フォームを TopMost = true、ShowInTaskbar = false で用意し、それを手前においておくという 方法もあるかと思います。この場合、手前の透明フォームがアクティブ化すると邪魔なので、 CreateParams をオーバーライドして、WS_EX_NOACTIVATE を加えるなどの対処が必要かも。
|
解決済み
|