Transparent Splash Screen

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Samus Aran.

    Transparent Splash Screen

    Hey,

    Ich versuche gerade das HIER mit einem anderen Bild nachzumachen - klappt irgendwie nicht.
    Die Demo von der Seite funktioniert..
    ich habe die "APP.vb" und "IMA.vb" im neuen projekt mit dem gleichen code erstellt und folgenden code in der form:

    VB.NET-Quellcode

    1. Imports sys = System
    2. Imports dra = System.Drawing
    3. Imports frm = System.Windows.Forms
    4. Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs)
    5. Dim gfx As dra.Graphics = pevent.Graphics
    6. gfx.DrawImage(IMA.imaSplashScreen, New dra.Rectangle(0, 0, Me.Width, Me.Height))
    7. End Sub


    Mein Bild habe ich in die Ressourcen geladen und in der "IMA.vb" entsprechend angepasst, sowie als Hintergrund der form.
    form style is "none".

    trotzdem bekomme ich immer nur eine weiße form mit einem roten "X" angezeigt.

    kann mir jemand weiterhelfen ? ;)

    lg
    das rote X bedeuet, dass es einen Fehler in GDI gab. Das man den Namespaces einen Alias (oder wie man sys, dra, frm und vermutlich IMA bezeichnen soll) geben kann wusste ich noch garnicht. Habe es noch nie gesehen und denke, dass du dich davon besser trennen solltest - stiftet in zukünftigen Problemen eher Verwirrung^^

    Setze mal einen Haltepunkt auf die gfx.Drawimage()-Zeile und prüfe ob IMA.imaSplashscreen wirklich NICHT Nothing ist. Ggf. eine eigene Variable für das Bild im Sub erstellen, damit du es beim debuggen besser prüfen kannst.

    Wenn sie Nothing ist, dann kannst du das mit einer einfachen If-Abfrage abfangen, also:
    If bla isnot nothing then ...
    dann ist bei dem IMA-Teil was falsch gelaufen.

    lg
    okay danke , das hat mich schonmal ein stück weiter gebracht =')
    IMA.imaSplashScreen ist Nothing - also konnte er das bild nicht laden !?

    der IMA teil sieht so aus..:


    VB.NET-Quellcode

    1. Imports sys = System
    2. Imports dra = System.Drawing
    3. Imports frm = System.Windows.Forms
    4. Imports dat = System.Data
    5. Imports vb = Microsoft.VisualBasic
    6. ' Embedded Images
    7. Class IMA
    8. ' Active Assembly
    9. Public Shared imaSplashScreen As dra.Image = dra.Image.FromStream(APP.GetResource("Unbenannt.png"))
    10. End Class


    APP:

    VB.NET-Quellcode

    1. Imports dra = System.Drawing
    2. Imports frm = System.Windows.Forms
    3. Imports sys = System
    4. Class APP
    5. Private Shared m_Assembly As sys.Reflection.Assembly = sys.Reflection.Assembly.GetExecutingAssembly()
    6. Private Shared m_AssemblyPath As String = APP.m_Assembly.GetName().Name().Replace(" ", "_")
    7. Public Shared Function GetResource(ByVal FileName As String) As sys.IO.Stream
    8. Return APP.m_Assembly.GetManifestResourceStream(APP.m_AssemblyPath & "." & FileName)
    9. End Function
    10. End Class


    hmm weiß nicht warum er das bild nicht laden kann.

    Das man den Namespaces einen Alias (oder wie man sys, dra, frm und vermutlich IMA bezeichnen soll) geben kann wusste ich noch garnicht. Habe es noch nie gesehen und denke, dass du dich davon besser trennen solltest - stiftet in zukünftigen Problemen eher Verwirrung

    wusste ich auchnicht ;-D werd ik bald umschreiben ^
    Das da ist IMO übel geknaupt xD Im endeffekt musst du nur ein Bild aus den Resourcen zeichnen - dafür braucht man keine zwei Klassen und iwelchen Reflection-Kram - also am besten komplett selbst schreiben und nicht kopieren. Ich habe momentan kein VS zur Hand und kann dir darum erst Morgen helfen, wie man das Bild aus den Resourcen läd.

    Zwischenzeitlich würde ich es einfach so machen:

    VB.NET-Quellcode

    1. Public Class KeineAhnung
    2. Public Sub New
    3. mysplash = new bitmap("splash.png")'Die Datei muss natürlich existieren und im gleichen ordner wie die .exe liegen!
    4. End Sub
    5. dim MySplash as bitmap = nothing
    6. Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs)
    7. with pevent.graphics
    8. .DrawImage(MySplash, New dra.Rectangle(0, 0, Me.Width, Me.Height))
    9. end with
    10. End Sub
    11. 'Overrides Sub onPaint(...)
    12. End Class


    Das ließe sich morgen mit ein paar neuen zeilen so erweitern, dass eine Datei aus den Resourcen geladen wird (anstatt aus einer richtigen .png datei im Verzeichnis der .exe). Wie das geht weiß ich auswendig nicht, muss ich mir angucken^^ vllt schreibt ja noch jemand anderes.

    Edit: das könnte helfen: dotnet-snippets.de/dns/bytearr…-to-bytearray-SID677.aspx
    Die Resourcen-BildDatei (my.resources.Meinsplash) liegt ja als Bytearray vor.

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

    yes , habs geschafft ;D

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports dra = System.Drawing
    3. Public Class Form3
    4. private MySplash As Bitmap = Nothing
    5. Private Sub Form3_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    6. MySplash = New Bitmap(My.Resources.Unbenannt_8)
    7. End Sub
    8. Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs)
    9. With pevent.Graphics
    10. .DrawImage(MySplash, New dra.Rectangle(0, 0, Me.Width, Me.Height))
    11. End With
    12. End Sub
    13. End Class


    Danke für die Hilfe ;)

    lg
    Da hab ich mich zu früh gefreut , es Funktioniert nur teilweise.

    Erst ist alles in ordnung doch sobalt das fenster verschoben wird, "kopiert" er sozusagen den hintergrund (alles was hinter dem fenster ist) mit - beispiel foto hängt an.
    habs bisher leider nicht lösen können -.-
    Bilder
    • Unbenannt.jpg

      631,19 kB, 1.920×1.080, 289 mal angesehen

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

    ja, würde ich auch so machen, wie Don_Bastisto sagt. Also einfach den Alpha-Kanal der PNG-Datei Magenta füllen und der Form sagen, dass diese Farbe transparent dargestellt werden soll.

    Btw: dann kannst du deinen ganzen Code vergessen, denn du musst nur das backgroundimage der Form setzten. Fertig. xD
    Wenn die Kanten unsauber sind liegts meist am Bild. Speichere das Bild doch mal als Bitmap ab und versuchs dann nochmal.

    Ich mache das bei meinen Forman immer so, dass ich die Bilder als Gif abspeichere und dann als Backgroundimage. Anschließend setzt du dann die Backgroundcolor Eigenschaft und setzt sie auf eine Farbe die in deinem Bild nicht vorkommt aber ähnlich ist. Wichtig dabei ist, das der Kontrast nicht allzu hoch ist. (Also zwischen der Backgroundcolor und den Farben des Bildes) Ich verwende dafür meist Web Farben wie zb DimGray Dann setzt die den Transparency Key auf die Background Color.

    Die Kanten wirken durch die ähnliche Backgroundfarbe nicht mehr unsauber
    Funktioniert:

    VB.NET-Quellcode

    1. Me.BackgroundImage = New Bitmap("lol.png")
    2. Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    3. Me.TransparencyKey = Color.Red
    4. Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
    5. With e.Graphics
    6. .InterpolationMode = Drawing2D.InterpolationMode.NearestNeighbor
    7. .DrawImage(Me.BackgroundImage, 0, 0, Width, Height)
    8. End With
    9. End Sub


    Auch mit sauberen Kanten - wenn die .PNG-Datei entsprechende qualität aufweist.

    @Cell
    liegt nich nur am Bild^^ PNG ist als Dateiformat Ideal, BMP würde auch gehen. JPG aber nicht. Wichtig ist, dass beim Zeichnen keine "neuen" Farben zwischeninterpoliert werden - darum nearstNeighbour-Interpolation und es läuft. Aber du hast recht: Wenn der Input schlecht ist wird das Ergebnis nicht besser.

    @Samus Aran
    wheres your god nao? :thumbsup: :thumbsup:

    lg


    Erstell mal bitte ne 800x600-Form mit diesem Bild als Hintergrund, und mach ein Video davon, wie du sie auf nem laufenden Youtube-Video hin und her schiebst. Dann glaub ich dir, dass das problemlos funktioniert.

    Edit: Hab deinen Weg mal getestet. Funktioniert super! :)