Abgeteilt von semi-transparentes Panel über andere Controls legen: Controls sind nicht zu sehen
Hallo,
ich habe gerade ein ähnliches Problem. Jedoch gehe ich das etwas anders an. Nach einigen kläglichen Versuchen, hab ich mich entschlossen, ein Teiltransparentes-PNG File zu erstellen, das ich dann in eine Klasse eingefügt habe, die von Control erbt
public class ControlTransparentShadow : Control
{
private Image image;
public ControlTransparentShadow()
{
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
BackColor = Color.Transparent;
}
public ControlTransparentShadow(Image image)
{
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
BackColor = Color.Transparent;
this.image = image;
RecreateHandle();
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20;
return cp;
}
}
protected override void OnPaint(PaintEventArgs e)
{
if (image != null)
{
e.Graphics.DrawImage(image, 0, 0);
}
}
protected override void OnPaintBackground(PaintEventArgs e)
{
//Do not paint background
}
//Hack
public void Redraw()
{
RecreateHandle();
}
public Image Image
{
get
{
return image;
}
set
{
image = value;
RecreateHandle();
}
}
}
Dieses Control lege ich auf meine Form und führe ".bringToFront()" aus, damit es alles überlagert. Jedoch drängen sich anschließend immer die darunter liegenden Controls wieder vor. Habe mal ein Bild angehägt, wie das aussieht.
€dit: Der Home Button liegt auf der Form, die anderen sind in einem User Control.
Hallo greenDot,
über die Schwierigkeiten/Einschränkungen mit Transparenz unter Windows Forms hat du ja schon in dem anderen Thread gelesen.
Ich vermute mal, dass sich immer das Control vordrängelt, dass gerade den Fokus hat? Wenn ja, würde ich auch dabei sagen: works as designed.
herbivore
Ja, da könntest du recht haben.
Aber auch wenn ich den Fokus ändere, drängeln sich die DataGridView und die Buttons vor. Man kann sie zwar nicht anklicken, weils das Control davor liegt, aber überzeichnen geht auch nicht.
Es gibt wohl wirklich keine zufrieden stellende Lösung, um mit Transparenz zu arbeiten.
lg
Hallo greenDot,
außer - wie schon im anderen Thread gesagt - alles selber zu zeichnen. Was allerdings nicht trivial ist, weil man dann das Verhalten der Controls selbst nachprogrammieren muss.
WPF bietet meines Wissens echte Transparenz.
herbivore
Hab jetzt eine Lösung:
Hab mir einen Screenshot mit einer Methode von Jelly angefertigt:
private Image CaptureForm()
{
Rectangle r = this.RectangleToScreen(this.ClientRectangle);
Image img = new Bitmap(r.Width, r.Height);
using (Graphics gfx = Graphics.FromImage(img))
{
gfx.CopyFromScreen(r.Left, r.Top, 0, 0, img.Size);
}
return img;
}
Diese ist in Image vom Fenster ohne Rahmen und Titel zu finden.
Anschließend hab ich das so eingebaut, und dieses Image mit einem Halb-Transparenten Brush übermalt:
public static Image GetClientSizeScreenshot(Form form)
{
Rectangle rect = form.RectangleToScreen(form.ClientRectangle);
Image img = new Bitmap(rect.Width, rect.Height);
using (Graphics gfx = Graphics.FromImage(img))
{
gfx.CopyFromScreen(rect.Left, rect.Top, 0, 0, img.Size);
}
return img;
}
public static Image GetShadowedScreenshot(Form form)
{
Image img = GetClientSizeScreenshot(form);
SolidBrush solidBrush = new SolidBrush(Color.FromArgb(128, 0, 0, 0));
Graphics g = Graphics.FromImage(img);
g.FillRectangle(solidBrush, new Rectangle(0, 0, img.Width, img.Height));
return img;
}
Und anschließend in ein normales Control eingefügt.
Das Ergebnis ist im Anhang.
Danke
€dit: Hab ein paar Werte zensiert. Ist leider notwendig 😉
Schöne Lösung, die aber nur funktioniert, wenn der Anwender die Größe des Fensters nicht verändert, solange der ausgeblendete Inhalt angezeigt wird. Ich würde also noch die entsprechenden Events abfangen um das Ändern der Fenstergröße zumindest für diesen Zeitraum zu unterbinden.
Gruß,
wcseller
Was du auch machen kannst, ist eine transparente Form ohne Rahmen (BorderStyle = None) über den Clientbereich der Haupt-Form zu legen, in der das Unterschriften-Feld sitzt.
Gruß, Christian.
Schöne Lösung, die aber nur funktioniert, wenn der Anwender die Größe des Fensters nicht verändert, solange der ausgeblendete Inhalt angezeigt wird. Ich würde also noch die entsprechenden Events abfangen um das Ändern der Fenstergröße zumindest für diesen Zeitraum zu unterbinden.
Die Lösung funktioniert 😉 Das Fenster ist auf 1024*768 beschränkt und kann auch nicht verändert werden. Jedoch eine gute Überlegung, danke.
Was du auch machen kannst, ist eine transparente Form ohne Rahmen (BorderStyle = None) über den Clientbereich der Haupt-Form zu legen, in der das Unterschriften-Feld sitzt.
Naja, aber wenn man dann bei dieser Form die Opacity einstellt, verändert sicht nicht nur der Hintergrund, sondern genauso das Unterschriftenfeld wird transparent.
... [wird] das Unterschriftenfeld wird transparent.
Stimmt, soweit hatte ich nicht gedacht...