Transparenz eines Fensters ohne VisualStyles möglich?

  • C#

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Fakiz.

    Transparenz eines Fensters ohne VisualStyles möglich?

    Guten Tag,
    ist es möglich ein Fenster (Win Forms) ohne VisualStyles transparent zu gestalten? Die Eigenschaft Opacity greift hier nicht ebenso funktioniert das nicht wenn ich die LayeredWindowAttributes ändere.
    @Fakiz Warum sollte ein WindowsMediaPlayer transparent sein?
    Hilft da ggf. ein Hintergrundbild?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi
    es gibt auch eine Control.Region-Eigenschaft (diese bspw. für die Form setzen).
    TransparencyKey halte ich für ein Unding, quasi eine Unnötigkeit, da mir kein Fall bekannt ist, bei der es nötig wäre. Bei aktuellen visuellen Stilen kann man einfach nicht ausschließen, dass eine Farbe auf der Form vorkommt.

    Dennoch halte ich RodFromGermanys Frage nach dem Grund für das WMP-Control für relevant.

    Viele Grüße
    ~blaze~
    Der Mediaplayer bzw. das Steuerelement davon nimmt die Transparenz dessen Parent an, soweit ich das sehe. Da ich eine Visualisierung verwende bringt mir ein Hintergrundbild leider auch nichts.

    *Edit*
    Ich vermute ich habe die Frage falsch verstanden. Der Grund warum ich die Transparenz benötige wäre ein Fadein/out Effekt. Ich darf/soll den Windows start mit einem Random Musikstück ausstaten. Hierfür setze ich eine Form als Desktophintergrund. Auf dieser Form ist ein MediaPlayer der eine .mp3 abspielt, die Form soll nun bis 80% langsam eingeblendet werden und im Anschluss wieder ausgeblendet werden.
    Bilder
    • preview.PNG

      24,01 kB, 298×296, 72 mal angesehen
    • preview1.png

      23,22 kB, 295×298, 76 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Fakiz“ ()

    Das ganze sollte letztendlich von nicht sichtbar bis 80% sichtbarkeit eingeblendet werden. Nach dem eine .mp3 abgespielt wurde soll es bis zur unsichtbarkeit ausgeblendet werden und im Anschluss beendet sich die Anwendung.
    Für ein besseres Verständniss habe ich das Projekt mal angehängt. Dabei sieht man das obwohl die LayeredWindowAttributes auf Transparent geändert wurden dennoch das Hintergrundbild komplett überdeckt und keine Teiltransparenz der Form erkennbar ist.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Fakiz“ ()

    Fakiz schrieb:


    Für ein besseres Verständniss habe ich das Projekt mal angehängt. Dabei sieht man das obwohl die LayeredWindowAttributes auf Transparent geändert wurden dennoch das Hintergrundbild komplett überdeckt und keine Teiltransparenz der Form erkennbar ist.


    1. bevor der Mediaplayer aufgerufen wird solltest Du sicherstellen, dass auch mp3's eingetragen sind. if(mp3Files.Length > 0)
    2. Das Fenster wird zunächst gar nicht gezeigt, das solltest Du besser ändern, sonst verpufft der Effekt ja.
    2. Ich habe hier etwas gefunden, mit dem ich das Faden Out fast ohne Änderungen realisieren konnte. Kleinigkeiten wie das FadeOut vom richtigen Ereignis aus anzusteuern oder breits bei .8 (80%) das FadeIn zu stoppen sind natürlich zu machen.
    Auf welche Werte setzt du sie denn? 0 ist vollständig transparent

    Bei der Eigenschaft Opacity starte ich bei 0 und gehe in 0.01 Schritten bzw. würde ich.
    PseudoBeispiel

    C#-Quellcode

    1. private bool bFadeIn = true;
    2. private void Timer_Elapsed(...)
    3. {
    4. if (bFadeIn) {
    5. if (this.Opacity < 1)
    6. this.Opacity += 0.01d;
    7. else {
    8. Timer.Stop();
    9. bFadeIn = false;
    10. }
    11. }
    12. else {
    13. if (this.Opacity > 0)
    14. this.Opacity -= 0.01d;
    15. else {
    16. Timer.Stop();
    17. this.Close();
    18. }
    19. }
    20. }


    könnteste das nicht iwie uppen, dass mans zügig auch in Gang kriegt? Und bitte ohne bin-Ordner!

    Habs auf den relevanten teil runtergebrochen. Sorry an die Binärdaten habe ich gestern nicht gedacht.

    bevor der Mediaplayer aufgerufen wird solltest Du sicherstellen, dass auch mp3's eingetragen sind. if(mp3Files.Length > 0)

    Mach ich auch if (mp3Files != null && mp3Files.Length > 0)

    Ich hab auch noch mal ein Bild gemacht um zu verdeutlichen was ich meine. Die Transparenz versuche ich dabei mit der Windows -Funktion SetLayeredWindowAttributes zu erreichen. Bei dieser Funktion ist 255 vollständig opak. Mit 200 sollte also eine leichte transparenz erreicht werden zu sehen an preview1.png.

    C#-Quellcode

    1. SetLayeredWindowAttributes(this.Handle, 0, 200, LWA_ALPHA);



    *Edit*
    So funktioniert das
    Spoiler anzeigen

    C#-Quellcode

    1. NativeMethodes.SetWindowLong(this.Handle, NativeMethodes.GWL_EXSTYLE, NativeMethodes.GetWindowLong(this.Handle, NativeMethodes.GWL_EXSTYLE) ^ NativeMethodes.WS_EX_LAYERED);
    2. NativeMethodes.SetParent(this.Handle, hProgman);
    3. NativeMethodes.SetLayeredWindowAttributes(this.Handle, 0, 200, NativeMethodes.LWA_ALPHA);

    Bilder
    • preview.png

      238,57 kB, 1.919×1.078, 81 mal angesehen
    • preview1.png

      101,43 kB, 1.359×861, 80 mal angesehen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Fakiz“ ()

    Bei dem Sample war das ganze auskommentiert und statt dessen ein FolderbrowserDailog in verwendung.

    So sah die From_Load aus (Zeile 21)
    Spoiler anzeigen

    C#-Quellcode

    1. private void Form1_Load(object sender, EventArgs e)
    2. {
    3. axWindowsMediaPlayer_main.uiMode = "none";
    4. //if (Properties.Settings.Default.MusicPath != "")
    5. // mp3Files = new DirectoryInfo(Properties.Settings.Default.MusicPath).GetFiles("*.mp3", SearchOption.TopDirectoryOnly);
    6. using (FolderBrowserDialog fb = new FolderBrowserDialog()) {
    7. fb.Description = "Bitte eine mp3 Datei auswählen";
    8. if (fb.ShowDialog() == DialogResult.OK) {
    9. mp3Files = new DirectoryInfo(fb.SelectedPath).GetFiles("*.mp3", SearchOption.TopDirectoryOnly);
    10. CreateNewWorkerW();
    11. if (hProgman != IntPtr.Zero) {
    12. NativeMethodes.SetWindowLong(this.Handle, NativeMethodes.GWL_EXSTYLE, NativeMethodes.GetWindowLong(this.Handle, NativeMethodes.GWL_EXSTYLE) ^ NativeMethodes.WS_EX_LAYERED);
    13. NativeMethodes.SetLayeredWindowAttributes(this.Handle, 0, 200, NativeMethodes.LWA_ALPHA);
    14. NativeMethodes.SetParent(this.Handle, hProgman);
    15. }
    16. }
    17. }
    18. //if (mp3Files != null && mp3Files.Length > 0) {
    19. // Random rnd = new Random();
    20. // axWindowsMediaPlayer_main.URL = mp3Files[rnd.Next(0, mp3Files.Length)].FullName;
    21. // CreateNewWorkerW();
    22. // if (hProgman != IntPtr.Zero) {
    23. // //NativeMethodes.SetWindowLong(this.Handle, NativeMethodes.GWL_EXSTYLE, NativeMethodes.GetWindowLong(this.Handle, NativeMethodes.GWL_EXSTYLE) ^ NativeMethodes.WS_EX_LAYERED);
    24. // //NativeMethodes.SetLayeredWindowAttributes(this.Handle, 0, 200, NativeMethodes.LWA_ALPHA);
    25. // NativeMethodes.SetParent(this.Handle, hProgman);
    26. // }
    27. //}
    28. //else {
    29. // MessageBox.Show("Es wurde kein Musik -Pfad gewählt", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
    30. // this.WindowState = FormWindowState.Normal;
    31. // this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
    32. //}
    33. }

    Denkst Du ich guck mir den auskommentierten Code an?

    Ich rede hiervon
    Spoiler anzeigen

    C#-Quellcode

    1. using (FolderBrowserDialog fb = new FolderBrowserDialog())
    2. {
    3. fb.Description = "Bitte whälen sie einen Ordner mit mp3 -Dateien";
    4. if (fb.ShowDialog() == DialogResult.OK)
    5. {
    6. mp3Files = new DirectoryInfo(fb.SelectedPath).GetFiles("*.mp3", SearchOption.TopDirectoryOnly);
    7. Random rnd = new Random();
    8. axWindowsMediaPlayer_main.URL = mp3Files[rnd.Next(0, mp3Files.Length)].FullName;
    9. CreateNewWorkerW();
    10. if (hProgman != IntPtr.Zero)
    11. {
    12. NativeMethodes.SetParent(this.Handle, hProgman);
    13. NativeMethodes.SetWindowLong(hProgman, NativeMethodes.GWL_EXSTYLE, NativeMethodes.GetWindowLong(hProgman, NativeMethodes.GWL_EXSTYLE) ^ NativeMethodes.WS_EX_LAYERED);
    14. NativeMethodes.SetLayeredWindowAttributes(hProgman, 0, 200, NativeMethodes.LWA_ALPHA);
    15. }
    16. }
    17. }

    Den FolderBrowserDialog hab ich nur kurz fürs Forum rein gehauen. Der ist bei mir nicht in verwendung.
    Die Form_Load die verwendet wird sieht so aus:

    Spoiler anzeigen

    C#-Quellcode

    1. private void Form1_Load(object sender, EventArgs e)
    2. {
    3. axWindowsMediaPlayer_main.uiMode = "none";
    4. if (Properties.Settings.Default.MusicPath != "")
    5. mp3Files = new DirectoryInfo(Properties.Settings.Default.MusicPath).GetFiles("*.mp3", SearchOption.TopDirectoryOnly);
    6. if (mp3Files != null && mp3Files.Length > 0) {
    7. Random rnd = new Random();
    8. axWindowsMediaPlayer_main.URL = mp3Files[rnd.Next(0, mp3Files.Length)].FullName;
    9. CreateNewWorkerW();
    10. if (hProgman != IntPtr.Zero) {
    11. //NativeMethodes.SetWindowLong(this.Handle, NativeMethodes.GWL_EXSTYLE, NativeMethodes.GetWindowLong(this.Handle, NativeMethodes.GWL_EXSTYLE) ^ NativeMethodes.WS_EX_LAYERED);
    12. //NativeMethodes.SetLayeredWindowAttributes(this.Handle, 0, 200, NativeMethodes.LWA_ALPHA);
    13. NativeMethodes.SetParent(this.Handle, hProgman);
    14. }
    15. }
    16. else {
    17. MessageBox.Show("Es wurde kein Musik -Pfad gewählt", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
    18. this.WindowState = FormWindowState.Normal;
    19. this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
    20. }
    21. }