Laden...

semi-transparentes Control über andere Controls legen: Controls drängeln sich vor

Erstellt von greenDot vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.807 Views
G
greenDot Themenstarter:in
4 Beiträge seit 2011
vor 12 Jahren
semi-transparentes Control über andere Controls legen: Controls drängeln sich vor

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.

49.485 Beiträge seit 2005
vor 12 Jahren

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

G
greenDot Themenstarter:in
4 Beiträge seit 2011
vor 12 Jahren

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

49.485 Beiträge seit 2005
vor 12 Jahren

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

G
greenDot Themenstarter:in
4 Beiträge seit 2011
vor 12 Jahren

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 😉

W
195 Beiträge seit 2008
vor 12 Jahren

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

795 Beiträge seit 2006
vor 12 Jahren

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.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
G
greenDot Themenstarter:in
4 Beiträge seit 2011
vor 12 Jahren

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.

795 Beiträge seit 2006
vor 12 Jahren

... [wird] das Unterschriftenfeld wird transparent.

Stimmt, soweit hatte ich nicht gedacht...

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`