Transparenz in UserControl

mustang-1969

Grünschnabel
Hallo erstmal!

Ich habe ein UserControl mit transparentem Hintergrund und darauf ein in der OnPaint-Methode erstellter Pfeil. Dieses Usercontrol wird zur Laufzeit dynamisch mehrmals in ein Panel geladen.
Die Anzeige ist grundsätzlich korrekt: der Hintergrund ist Transparent und der Pfeil sichtbar.
ABER: Wenn sich zwei dieser UserControls überschneiden ist zwar immernoch der Hintergrund des Panels sichtbar, aber ein Control verdeckt den Pfeil des zweiten darunterliegenden Controls. D.h. die Transparenz bezieht sich darauf, dass der PanelHintergrund immer sichtbar ist, aber nicht ein zweites unter einem Control liegendes Control. Dieses (also die Pfeilreste) sieht man erst außerhalb des darüberliegenden Controls (bzw. des imaginären Randes).

Hab' schon alles im Netz abgesucht, aber nichts dazu gefunden. Rumgespielt mit Opacity - nix.

Folgender Code ist auch eingebaut:
Code:
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);

Hilft aber alles nichts!

Hat irgendjemand eine Idee oder geht das grundsätzlich mit UserControls nicht?

Grüsse Ralf
 
Hallo und herzlich willkommen im Forum.

Könntest du einen Screenshot anhängen? Dadurch tut man sich dann doch etwas leichter :)
 
Ja natürlich - hier der Screenshot. Ich habe ihn etwas modifiziert:
Das Raster ist der Panelhintergrund.
Der durchgehende Pfeil in der Mitte ist das betreffende obenliegende transparente UserControl. Den roten Rand habe ich jetzt nachträglich eingezeichnet und stellt dessen 'offiziellen' Rand dar.
Darunter liegt ein zweiter UserControl-Pfeil mit gleichem Anfangspunkt. Der gestrichelte Teil fehlt in echt, sollte aber (nach Logik der Transparenz) ebenfalls sichtbar sein.

IST ES ABER NICHT :confused:
 

Anhänge

  • CustomControls.jpg
    CustomControls.jpg
    23,3 KB · Aufrufe: 314
Hallo,

folgender Code in OnPaint ergänzt
Code:
SetStyle(ControlStyles.Opaque, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
BackColor = Color.FromArgb(0, 0, 0, 0);
und es geht.

Aber nun habe ich gleich die nächsten Probleme:
1.
Wenn ich meine grüne Balken verschiebe (ebenfalls CustomControls) bleibt der Panel-Hintergrund an der alten Balkenposition solange grau, wie das OnMouseMove-Event wirkt. Erst bei kurzen Pausen wird der Hintergrund neu gezeichnet. Dies hat natürlich sehr häßliche Effekte (siehe Bild).
Wie kann dies vermieden werden?

2.
Auch die Pfeil-Controls, deren OnPaint-Methode durch das Balkenschieben getriggert werden verhalten sich nicht korrekt:
Code:
protected override void OnPaintBackground(PaintEventArgs pevent)
{}
verhindert das Neuzeichnen des Backgounds, wodurch teilweise 'alte' Pfeile einfach in der Landschaft stehen bleiben. Mit
Code:
protected override void OnPaintBackground(PaintEventArgs pevent)
{
   base.OnPaintBackground(pevent);
}
bleiben keine Pfeile fälschlichweise stehen, aber wie bei (1) bleibt der Background bei OnMove grau bis der Pfeil 'stehen bleibt'.
Wenn ich in die Pfeil-Controls die Clear-Funktion einbaue
Code:
public void Clear()
{
   if (Parent == null)
      return;

   Rectangle rc = new Rectangle(this.Location, this.Size);
   Parent.Invalidate(rc, true);
}
und von außerhalb bei Balken-OnMouseMoves, wo das Neuzeichnen der betreffenden Pfeile mit Pfeil.Invalidate() getriggert wird mit aufrufe, dann flackert der betreffende Bereich.
Lösungsvorschlag?

3.
Das gesamte Raster im zugrunde liegenden Panel wird bei jedem neuzeichnen (Panel_OnPaint()) neu berechnet. Dies ist natürlich performance-mäßig ziemlich schlecht.
Ich denke es wäre eine gute Idee, dass beim ersten Zeichnen des Rasters dieses in ein Image geschoben wird und dann ab dem 2. Neuzeichnen nur mehr das Image neu hinterlegt wird.
Ist dies eine gute Idee und wenn ja wie könnte dies Code-technisch realisiert werden?

Gruß Ralf
 

Anhänge

  • CustomControls2.gif
    CustomControls2.gif
    1,7 KB · Aufrufe: 94
Zurück