none
Wieder mal transparentes Panel RRS feed

  • Frage

  • Hallo,

    ich habe schon gesehen, dass es mehrere Einträge gibt, wie man ein Panel transparent bekommt.

    Aber seit mindestens 2 Trage drehe ich mich total im Kreis und erreiche es nie, dass das Panel wie gewünscht durchsichtig ist, so brauche ich wirklich Hilfe, denn irgend etwas habe ich nicht richtig verstanden!

    Wenn ich die Anleitung unter "Gewusst wie: Verwenden eines transparenten Hintergrunds für ein Steuerelement" wörtlich nehme, dann muss ich eine Klasse von Panel ableiten, denn nur in dem Konstruktor kann ich "SetStyle" verwenden.

    Gut, das ist der Code von MyPanel:

    public class MyPanel : Panel
        {
          public MyPanel()
          {
            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            this.BackColor = Color.Transparent;
          }
        }
    

    Wenn ich den nun aufrufe, dann sollte eigentlich das Panel durchsichtig sein, hier der Code:

          TourPanel = new MyPanel();
          TourPanel.Parent = Kartepanel;
          TourPanel.Left = 10;
          TourPanel.Top = 10;
          TourPanel.Width = 200;
          TourPanel.Height = 200;
          TourPanel.BackColor = Color.Transparent;
          TourPanel.Show();
    

    Ist es aber nicht!

    Welchen Denkfehler habe ich da?

    Ich brauche insgesamt 4 übereinander liegende Panels, wovon das unterste nicht transparent sein soll, aber die 3 anderen  darüber liegenden müssen es seiin.

    Ansonsten bin ich von der (auch skalierten) Darstellung von PNG Dateien positiv überrascht.

    Ich bitte, mich bei den transparenten Panels "bei der Hand zu nehmen" und mich den fehlenden Weg zu leiten.

    Herzlichen Dank.

    Fragende Grüße,

    schymura

     

    Donnerstag, 10. Februar 2011 14:26

Alle Antworten

  • Hallo Schymura,

    ich denke du verwendest Windows Forms.

    Und das wird es schon relativ Tricky. Window Forms Controls kennen keine wirkliche Transparenz. Was ich damit meine, kannst du auf folgendem Link (http://www.bobpowell.net/transcontrols.htm) mal anschauen. Im Prinzip macht ein "transparentes" Control nichts anderes, als den Hintergrund seines Parentcontrols zu kopieren. Es gibt dort zwar Möglichkeiten eine "pseudo" Transparenz zu erstellen (siehe gleicher Link), aber das ist alles mehr Krampf als wirklich brauchbar.

    Wenn du solche Sachen vorhast, rate ich dir zur WPF. Dort können die Controls von Haus aus "richtige" Transparenz.

    Aber ich verstehe ehrlich gesagt nicht ganz wozu du 3(!) transparente Panels übereinander brauchst?!?!?!

     

    Viele Grüße
    Holger M. Rößler

    Montag, 14. Februar 2011 21:50
  • Hallo Holger,

    danke für die Antwort.

    Deinen Linke hatte ich auch schon "abgegrast".

    Zwischenzeitlich habe ich ja auch probiert und dabei auch noch etwas für mich Überraschendes entdeckt.

    Wenn man ein Panel zur Laufzeit erzeugt kann man im Konstruktor über "SetStyle(ControlStyles.Opaque, true);" den Hintergrund auf transparent schalten.

    Dabei ist es egal ob vorher über "SetStyle(ControlStyles.SupportsTransparentBackColor, true);" der Hintergrund extra auf transparent geschaltet wurde, oder nicht, hat dann keine weitere Auswirkung.

    Setzt man dann noch "UserPaint" auf true kann man dann in der " OnPrint " Methode des Panels  entsprechend reagieren.

    Nun noch dazu, weshalb ich so viel unterschiedliche Panels "benötige".

    Du kannst dir als Beispiel dazu Bilder auf http://www.hj-schymura.de/index.php?Auswahl=Hilfe&Menuepunkt=Track2Karte anschauen.

    Das ist ein "Turbo Delphi" Programm, das aus aufgezeichneten Trackdaten über freies Kartenmaterial (OSM) eine entsprechende Karte erzeugt, diese anzeigt und dann den "Trackverlauf" einzeichnet, (natürlich in einem darüberliegenen durchsichtigen Panel).

    In einem weitere, durchsichtigen, darüber liegenden Panel wird dann auch noch der aktuelle Standort eingezeichnet. Außerdem gibt es dann noch, bei Bedarf, andere unterschiedliche, darüber liegende Panels für andere Ausgaben, damit z.B. auch die entsprechende CopyRight Anzeige  vorhanden ist, wenn man die Bildschirmanzeige als Sreenshot einfängt.

    Dies in etwas möchte ich mit C# Express neu programmieren.

    Nochmals danke.

    Schöne Grüße,

    schymura



    Dienstag, 15. Februar 2011 08:07