TransparencyKey

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Derfuhr.

    TransparencyKey

    Hey Leute,
    Ich habe in meinem Programm zur optischen verbesserung eine kleine Einblendung eingeplant, jedoch funktioniert nicht alles so wie ich es will.
    Beim Start des Programmes ist ein Schriftzug zu sehen, jedoch soll der hintergund der Schriftzuges Transparent sein.
    Beim laden der Form ist dieses aber nur der fall wen Opacity auf 100 steht, dieses sieht aber nicht gerade schön aus...
    Wie kann ich dieses Problem lösen?


    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. TransparencyKey = Color.White
    3. Timer1.Start()
    4. End Sub
    5. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    6. Me.Opacity += 0.01
    7. If Me.Opacity = 1 Then
    8. Timer1.Stop()
    9. Threading.Thread.Sleep(1500)
    10. Me.Hide()
    11. Schritt1.Show()
    12. End If
    13. End Sub

    In dem fall solltest du vieleicht mit Me.Region arbeiten

    In folgenden Beispiel wird Form1 als Text "gemalt"

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim gp As New System.Drawing.Drawing2D.GraphicsPath
    3. Dim family As New FontFamily("Arial")
    4. Dim myfontStyle As Integer = CInt(FontStyle.Italic)
    5. Dim emSize As Integer = 100
    6. Dim origin As New Point(20, 20)
    7. Dim format As StringFormat = StringFormat.GenericDefault
    8. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    9. Me.Opacity += 0.03
    10. If Me.Opacity > 0.99 Then
    11. Timer1.Stop()
    12. Me.Hide()
    13. Schritt1.Show()
    14. End If
    15. End Sub
    16. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    17. Me.Opacity = 0
    18. Me.StartPosition = FormStartPosition.CenterScreen
    19. Me.Width = 1024
    20. Me.Height = 768
    21. Me.BackColor = Color.Black
    22. gp.AddString("Meinst du so?", family, myfontStyle, emSize, origin, format)
    23. Me.Region = New Region(gp)
    24. Me.Timer1.Interval = 1
    25. Me.Timer1.Start()
    26. End Sub
    27. End Class


    Hast du das so gemeint?

    ProjektMappe :WindowsApplication1.7z

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Derfuhr“ ()

    Ich habe einen Schriftzug der als PNG datei als hintergundbild in der Form ist.
    Nun habe ich es so gemacht das die Hintergrundfarbe der Form1 auf weiß ist, die dieses Bild ja einer PNG datei ist.
    Darauf habe ich eingestellt das alles weißen Farben in der Form transparent werden, dieses funktioniert aber nicht wenn man die Transparens umstellt.
    erst wenn Opacity auf 100% ist, wird der weiße Bereich durchsichtig.

    Ich hab lange überlegt, aber eine Lösung gefunden

    Ist vieleicht nicht besonders gut, geht vielleicht sogar etwas einfacher,aber es geht.
    Wenn Form1 geladen wird, wird ein screenshot von dem bereich gemachtwo Form1
    erscheint, dieses bild dann als PictureBox1.BackGroundImage gesetzt.
    Den Rest schaut selbst :D

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Me.Opacity = 0
    4. Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    5. Me.CenterToScreen()
    6. Me.Width = 250
    7. Me.Height = 250
    8. Me.PictureBox1.Location = New Point(0, 0)
    9. Me.PictureBox1.Width = 250
    10. Me.PictureBox1.Height = 250
    11. Me.PictureBox1.BringToFront()
    12. Me.Timer1.Interval = 500
    13. Me.PictureBox1.BackgroundImage = FotoMachen()
    14. Me.PictureBox1.Image = My.Resources._1
    15. Me.Timer1.Start()
    16. End Sub
    17. Public Function FotoMachen() As Bitmap
    18. Dim desktopimage As New Bitmap(Me.Width, Me.Height)
    19. Dim g As Graphics = Graphics.FromImage(desktopimage)
    20. g.CopyFromScreen(Me.Location.X, Me.Location.Y, 0, 0, desktopimage.Size)
    21. g.Dispose()
    22. Return desktopimage
    23. End Function
    24. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    25. Me.Opacity += 0.05
    26. If Me.Opacity = 1 Then
    27. Me.Timer1.Stop()
    28. Me.Close()
    29. End If
    30. End Sub
    31. End Class


    Projektmappe:
    Dateien

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Derfuhr“ ()

    Du musst deine .png zu den Ressourcen hinzufügen und dann:

    anstatt

    VB.NET-Quellcode

    1. Me.PictureBox1.Image = My.Resources._1


    nimmst du

    VB.NET-Quellcode

    1. Me.PictureBox1.Image = My.Resources.'name deiner png


    du musst auch noch die Größe von Form1 und PictureBox1 auf deine Bildgröße anpassen :!:

    P.S. wer dankbar ist klickt auf hilfreich......

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

    mit einem screenshot, ja. aber das ist unperformant und ein unschoener workaround weil sich während des einfadens was aendern kann und dann passt das nicht. ausserdem brit dein screenshot rein garnichts weil das nicht den transparency-key "bug" behebt.
    mit einem screenshot, ja. aber das ist unperformant und ein unschoener
    workaround weil sich während des einfadens was aendern kann und dann
    passt das nicht.
    Da es sich um eine Art "SplashScreen" handelt kann man auch den ganzen Desktop
    knipsen, form1 & picturebox auf desktopsize, picturebox.sizemode auf center image,
    topmost = true so wäre die kleinere png auch mittig, so wäre der desktop zwar
    kurz nicht verfügbar, aber eine falsche optik ausgeschlossen (glaub ich zumindest)

    Klar gibt es bessere Methoden, aber man kann nur das Proggen was man kann, leider.

    edit:
    das funktioniert so nicht mit winforms. nimm wpf
    kinsi und SeriTools hatten absolut recht, habs mal in WPF probiert,
    ich bin mehr als nur begeistert!!!

    zum vergleich:

    WpfApplication1.7z

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Derfuhr“ ()