Herkese merhaba ve hayırlı geceler. C# Windows Forms üzerinde bir proje geliştirmekteyim.
Proje Tasarımı
Çerçevesiz, 500px genişliğe ve 350px yüksekliğe sahip bir Form var. Bu Form'u boydan boya kaplayan bir WebBrowser ve WebBrowser'ın önünü tamamen kapatan bir Panel var.
Yapmak İstediğim Şey
WebBrowser'ın önünü tamamen kapatan Panel, %30 saydamlık değerine sahip olacak. Saydam Panel'in arkasında ise Form'un BackColor'u değil, Panel'in arkasındaki tüm Control'ler görünecek. WebBrowser'dan video oynatılsa bile Saydam Panel'in arkasından bu video rahatlıkla seyredilebilecek.
Kısaca, saydam bir Control'un arkasındaki Control veya Control'leri görmek istiyorum.
Denediğim Yöntemler
StackOverFlow üzerinde ExtendedPanel.cs adında, Panel Control'u üzerinden türetilmiş bir Control class'ı buldum ve projeme entegre ettim.
Link: https://stackoverflow.com/questions/32400320/any-trick-to-use-opacity-on-a-panel-in-visual-studio-window-form
Kod
public class ExtendedPanel : Panel
{
private const int WS_EX_TRANSPARENT = 0x20;
public ExtendedPanel()
{
SetStyle(ControlStyles.Opaque, true);
}
private int opacity = 50;
[DefaultValue(50)]
public int Opacity
{
get
{
return this.opacity;
}
set
{
if (value < 0 || value > 100)
throw new ArgumentException("value must be between 0 and 100");
this.opacity = value;
}
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;
return cp;
}
}
protected override void OnPaint(PaintEventArgs e)
{
using (var brush = new SolidBrush(Color.FromArgb(this.opacity * 255 / 100, this.BackColor)))
{
e.Graphics.FillRectangle(brush, this.ClientRectangle);
}
base.OnPaint(e);
}
}
Görsel
Görselde de gördüğünüz gibi; gayet şık, saydam bir Panel Control'u var. Arkasındaki Control nesneleri rahatlıkla görülebiliyor. Buraya kadar her şey çok güzel.
Ancak saydam Panel Control'un problemi tam olarak şu: Arkasında bulunan herhangi bir Control'un görünümünde bir değişiklik olduğunda, ilgili Control, onun önüne çıkıyor. Yani onun arkasında bulunan bir WebBrowser'da video oynuyorsa, WebBrowser saydam Panel'in önüne çıkıyor, Panel onun önünü kapatamıyor.
Kısaca bu olay, saydam nesnenin arkasındaki Control'un görünümünde değişiklik olduğunda meydana geliyor.
Paylaştığım görselden yola çıkalım. "Button On Form" isimli Button'un büyük bir kısmı, saydam Panel'in arkasında. Ufak bir kısmı ise dışında. Panel'in dışında kalan kısmın üzerinden Mouse ile geçtiğinizde, Button'un görünümünde değişiklik oluyor (hover efekti devreye giriyor), bunun sonucunda da Button nesnesi olduğu gibi saydam Panel'in üstüne çıkıyor...
Tam Olarak İstediğim Şey
Öyle bir Panel olsun ki, arkasında bulunan herhangi bir Control'un görünümünde değişiklik olsa bile, o Control; yarı saydam Panel'in önüne çıkamasın.
Umarım anlatmak istediğim şeyi tam olarak anlatabilmişimdir. Konu hakkında yardımlarınızı bekliyorum.
Herkese iyi çalışmalar dilerim.