Clear() in transparenten CustomControl

mustang-1969

Grünschnabel
Hallo,

ich habe folgendes transparente Control:
Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace App
{
    class TransparentPictureBox : Panel
    {
        public TransparentPictureBox()
        {
            this.BorderStyle = BorderStyle.None;
            this.SetStyle(ControlStyles.Opaque, true);
            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            this.BackColor = Color.FromArgb(0, 0, 0, 0);
            this.Dock = DockStyle.Fill;
        }

        public void Erase()
        {
            Graphics g  = CreateGraphics();
            g.Clear(Color.FromArgb(0, 0, 0, 0));
            g.Dispose();
        }

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x00000020;
                return cp;
            }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
        }

        protected override void OnPaintBackground(PaintEventArgs e)
        {
        }
    }
}

In dieses Control zeichne ich aus externen Klassen etwas hinein.
Das funktioniert alles super.

Da diese 'Zeichnungen' laufend geändert werden, muss die Arbeitsfläche dauernd gelöscht und der Inhalt neu aufgebaut werden.
Dazu dient eigentlich die obige Codezeile
Code:
g.Clear(Color.FromArgb(0, 0, 0, 0));

-> Arbeitsbereich erneuern mit angegebener Farbe.

Hier beginnt mein Problem, sobald ich Erase() aufrufe:
Wenn ich irgendeine Farbe angebe, funktioniert es (Farbe blau - Control wird mit blauem Hintergrund 'gecleared'). Aber bei 'Color.Transparent' (was ich ja haben will!) bzw. Color.FromArgb(0, 0, 0, 0), was ebenfalls Transparenz bewirken sollte, erscheint das ganze Control SCHWARZ!?

Hat jemand eine Idee, wie ich ein sauberes transparents Arbeitsflächen-Clear hinbekomme?

Gruß Ralf
 
Hallo,

hab's inzwischen selbst rausgefunden:
Die Arbeitsfläche bei transparenten Controls kann nicht direkt gelöscht werden. Statt dessen muss der entsprechende Bereich des Parent-Controls zurückgesetzt werden:

Code:
public void Clear()
{
   if (Parent == null)
      return;

   Rectangle rc = new Rectangle(this.Location, this.Size);
   Parent.Invalidate(rc, true);
}

Damit aber gleich zur nächsten Frage:
Code:
Parent.Invalidate(rc, true);
veranlasst das Neuzeichnen des entsprechenden Bereiches erst beim 'nächsten regulären Neuzeichnen' des Controls. - Also nicht sofort!
Wenn man eine sofortiges Neuzeichnen erzwingen will muss man
Code:
Parent.Refresh();
angeben. Hier ist es aber nicht möglich nur den Teilbereich anzugeben, welcher Neugezeichnet werden soll.

Hat jemand eine Idee, wie sofortiges Neuzeichnen eines Teilbereiches erzwungen werden kann?

Gruss Ralf
 
Hallo,

wenn es interessiert, hier die Lösung:

Code:
public void Clear()
{
   if (Parent == null)
      return;

   Rectangle rc = new Rectangle(this.Location, this.Size);
   Parent.Invalidate(rc, true);
   Parent.Update();  
}

Update() erzwingt das Neuzeichnen des für ungültig erklärten Bereichs.

Gruss Ralf
 
Du bist ja drauf

Öffnest ein neues Thema mit einem Problem, löst das und stellst eine neue Frage.
Die löst du auch noch selbst......... das muss ich mir merken, nix gegen dich aber ich glaube du hast dich selbst übertroffen!!

....... cool .........
 
Zurück