Form erst laden, dann anzeigen?

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Form erst laden, dann anzeigen?

    Hallo,

    ich habe aktuell in einem Projekt einige Steuerelemente mit transparentem Hintergrund sowie GDI+-Grafiken. Wenn das Programm gestartet wird, blinken diese Steuerelemente für ein paar "Millisekunden" weiß auf. Ist es möglich, die Form erst vollständig zu laden und dann anzeigen zu lassen?

    Cheers
    Opacity ist ein Double, bedeutet es geht von 0 bis 1. Aber die Form wird doch während des Form-Load Events gar nicht angezeigt ?(

    Edit: Das mit von 0 bis 1 ist auf die Eigenschaft bezogen, nicht auf den Datentyp
    Mfg
    Vincent

    VB1963 schrieb:

    Versuche es so:

    VB.NET-Quellcode

    1. Private Sub Main_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. Me.Opacity = 0
    3. 'Code
    4. Me.Opacity = 100
    5. End Sub
    Danke, glaube ich aber eher nicht.

    Die Label etc. werden ja nicht im Form-Code geladen, sondern anderweitig.

    ... und Double ist schlicht und einfach eine Gleitkommazahl. Der Eigenschaftswert geht von 0 bis 1.

    Gruß
    Die Opacity-Eigenschaft der Form kannst du auch im Designer auf 0 voreinstellen (sollte eigentlich auch so gemacht werden).
    Im FormLoad- oder SownEreignis stellst du dann die Opacity der Form auf 1 ein.
    Das ist dann dein Code in der Ereignisbehandlungsroutine...

    VB1963 schrieb:

    Die Opacity-Eigenschaft der Form kannst du auch im Designer auf 0 voreinstellen (sollte eigentlich auch so gemacht werden).
    Im FormLoad- oder SownEreignis stellst du dann die Opacity der Form auf 1 ein.
    Das ist dann dein Code in der Ereignisbehandlungsroutine...

    Okay, das versuche ich mal.

    Dachte, es gäbe dahingehend eine "professionellere" Lösung.
    Du machst eine unsichtbare Form, ruft in dieser die Form mit New auf und schließt die Lade-Form, wenn die Hauptform geladen wurde. Der Code, den zu zum Laden benötigst packst du in Public Sub New von der Hauptform.
    So hab ich das auch bei meinem Program USB Watcher gemacht.
    Grüße,
    Lukas

    Fragen über Themen im Forum per Konversation werden gelöscht und die Absender blockiert...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Luki-Progger“ ()

    Mr.Blade schrieb:

    Dachte, es gäbe dahingehend eine "professionellere" Lösung.
    Die gibt es sicher.
    Methoden wie SuspendLayout, und dann ResumeLayout, die DoubleBuffered-Eigenschaft und viele andere Methoden aus dem Objektbrowser. Die Form zuerst unsichtbar zu machen, ist ein ziemlicher Workaround.
    Vielleicht hast du die Möglichkeit, der Community einen Teil des Codes (oder einen zusammengeschriebenen Beispielcode) zu geben, bei dem dieser Fehler auftritt.
    Naja, es handelt sich um einen Installer für ein Spiel, das unter Windows 64-Bit nicht installiert werdnen kann. Außerdem sind einige Patches etc. enthalten. In der Hoffnung, dass hier Links zu .exe-Dateien gepostet werden dürfen:

    *** Link zu EXE-Datei entfernt ***

    Ihr seht, dass beim Laden der Form die Steuerelemente kurz aufblinken. Dies soll verhindert werden. Die Hintergrundgrafiken etc. wurden mit GDI+ gezeichnet.

    Gruß

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

    zunächst mal sollteman die Performance-Fresser identifizieren, und gucken, ob da nicht iwie Mist gebaut ist, weil ein normales Form verhält sich nicht so.
    Ich habs grad probiert mit einem Form mit ca. 30 selbstgemalten Objekten.

    Es kann allerdings an allem möglchen liegen: unnötig fette Grafiken, falsches Laden von Grafiken, unnötig viele Controls, grundlegende Designfehler,...
    achja - transparente Controls fressen zigfache Zeichen-Performance.

    @TE: kannst du ein lauffähiges Sample anhängen, dass man den Fehler reproduzieren kann?

    ErfinderDesRades schrieb:

    zunächst mal sollteman die Performance-Fresser identifizieren, und gucken, ob da nicht iwie Mist gebaut ist, weil ein normales Form verhält sich nicht so.
    Ich habs grad probiert mit einem Form mit ca. 30 selbstgemalten Objekten.

    Es kann allerdings an allem möglchen liegen: unnötig fette Grafiken, falsches Laden von Grafiken, unnötig viele Controls, grundlegende Designfehler,...

    @TE: kannst du ein lauffähiges Sample anhängen, dass man den Fehler reproduzieren kann?

    Danke. Ich hab' die Datei in meinem vorherigen Post verlinkt. Hoffe, das ist okay. Das könntet Ihr euch mal anschauen.

    Die Grafiken sind passgenau zugeschnitten und wurden mit Photoshop erstellt, sie sind nicht zu groß.

    Gruß
    Hier mal der evtl. relevanteste Code:

    VB.NET-Quellcode

    1. Private Sub installer_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. installwizard.WorkerSupportsCancellation = True
    3. installwizard.WorkerReportsProgress = True
    4. End Sub
    5. Private Sub Installer_Draw(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    6. e.Graphics.DrawImage(My.Resources.topbar, 0, 0, 687, 35)
    7. e.Graphics.DrawImage(My.Resources.topbar, 0, 315, 687, 35)
    8. e.Graphics.DrawImage(My.Resources.indy_cover_installer2, 10, 46, 128, 128)
    9. e.Graphics.DrawImage(My.Resources.adept_installer, 10, 179, 128, 128)
    10. e.Graphics.DrawImage(My.Resources.cd, 5, 3, 29, 29)
    11. End Sub
    12. Dim mouseOffset As Point
    13. Private Sub Me_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseDown
    14. mouseOffset = New Point(-e.X, -e.Y)
    15. End Sub
    16. Private Sub Me_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseMove
    17. If e.Button = MouseButtons.Left Then
    18. Dim mousePos = Control.MousePosition
    19. mousePos.Offset(mouseOffset.X, mouseOffset.Y)
    20. Location = mousePos
    21. End If
    22. End Sub


    Hier noch die Steuerelemente auf der Form:



    Es liegen quasi mehrere Steuerelemente übereinander, die per Button ein- und ausgeblendet werden. Zunächst erscheint für den User ein Willkommensbildschirm (1), dann ein Bildschirm zur Eingabe des Installstionsverzeichnisses etc. (2) und schließlich wird der Installationsvorgang (3) mit ProgressBar dargestellt. Deshalb sieht es etwas durcheinander aus, zum Nachvollziehen einfach mal die *.exe anschauen. Es wird, bis zur Installation, nichts am System verändert. Und bis zur Installation kommt Ihr gar nicht erst, da Euch die CD fehlt. :D

    Gruß
    Danke.

    VB.NET-Quellcode

    1. Private Sub Installer_Draw(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    2. Dim Topbar As Image = My.Resources.topbar
    3. Dim Bottombar As Image = My.Resources.topbar
    4. Dim Cover As Image = My.Resources.indy_cover_installer2
    5. Dim Setup As Image = My.Resources.adept_installer
    6. Dim CD As Image = My.Resources.cd
    7. e.Graphics.DrawImage(Topbar, 0, 0, 687, 35)
    8. e.Graphics.DrawImage(Bottombar, 0, 315, 687, 35)
    9. e.Graphics.DrawImage(Cover, 10, 46, 128, 128)
    10. e.Graphics.DrawImage(Setup, 10, 179, 128, 128)
    11. e.Graphics.DrawImage(CD, 5, 3, 29, 29)
    12. End Sub

    Erzielt nicht gewünschten Effekt.

    Ich vermute, es hat etwas damit zutun, dass ich Steuerelemente übereinander gelegt habe. Diese werden per Eigenschaft .visible für den Benutzer ein- bzw. ausgeblendet bei Klick auf den jeweiligen Button. Vllt. ist das der Auslöser. Gibt's dafür eine alternative Lösung?

    Edit:

    Wobei es "blinkt auch weiß" bei Steurelementen, bei denen kein weiteres auf selber Position bei anderer Flächenebene oder .visible-Eigenschaft liegt.
    ich sagte "einmalig" an Variablen zuweisen, nicht in jedem Paint-Event neu.

    Meine Vermutung ist, dass das Abrufen eines Bildes aus den Resourcen einen Dateizugriff verursacht.
    Sicher binnich damit nicht.

    Edit: wenn ganz annere Steuerelemente blinken, dann ist der Code wohl doch nicht relevant, jdfs. nicht fürs Blinken.