[Tutorial] Form abdunkeln, während anderer Dialog offen ist.

    • VB.NET

    Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von progglord.

      [Tutorial] Form abdunkeln, während anderer Dialog offen ist.

      Hallo Community,

      wer hat es noch nicht gesehen, wenn wir etwas installieren wollen, dunkelt sich der Bildschirm oft ab und es erscheint eine Meldung, die unbedingt beantwortet werden will (meist, ob wir wirklich das Programm installieren wollen).

      Was nervig ist, ist ebenso günstig für ein Programm, denn man kann es nicht nur für Meldungen nehmen, man kann auch Dialoge oder anzuzeigende Bilder damit schön in den Vordergrund bringen.

      Genau das wollte ich auch haben und habe nach einem Tutorial dafür gesucht aber nur komplizierte und Ellen-Lange Code-Beispiele gefunden (Z. B. HIER). Alle waren darauf aus, auf der Form ein Rechteck zu zeichnen und dieses halbtransparant zu machen.

      Ich habe mir nun aber eine andere und vorallem leichtere Methode überlegt.



      Ziel:

      Wahlweise nur die Hauptform oder den ganzen Bildschirm abdunkeln und eine Form im Vordergrund anzeigen.

      Schwierigkeitsgrad:

      Anfänger

      Erklärung:

      Anders als bei den schönen Beispielen hier im Forum zu diesem Thema werden wir nichts zeichnen. (Screenshot im Anhang!)

      Wir brauchen für unser Beispiel ersteinmal 3 Formen:









      • eine Hauptform - diese wollen wir verdunkeln
      • eine Dialogform - diese soll im Vordergrund angezeigt werden
      • eine Verdunkelungsform - diese wird unse Hauptform verdunkeln




      So die Meisten von Eiuh wissen nun auf was ich hinaus möchte.

      Zuerst natürlich die Form1: Zieht die Form etwas größer, gebt ihr ein paar Steuerelemente und mindestens einen Button.

      Dann nehmen wir uns die Form2 vor: Dort müsst ihr FormBorderStyle auf None setzen, macht sie so groß wie Ihr wollt (aber nicht zu groß, kleiner ist besser) und erstellt zwei Button (einen "OK" und einen "Abbrechen"). Setzt dann TopMost auf true

      nun die Form3: Dort setzt ihr auch FormBorderStyle auf None, gebt der Form eine dunkle Farbe (am Besten RGB 64;64;64) und setzt die Opazität auf 80%. Setzt auch hier TopMost auf true

      Jetzt kommt der Code:

      Wir nehmen also die Form3, welche durch die dunkle Farbe und die Opazität als verdunkeler dient, und rufen Sie auf.

      Im Form3_Load() stellt Ihr nun die gewünschte größe der Form ein, nämlich:

      Variante1: Nur die Hauptform soll verdunkelt werden.

      VB.NET-Quellcode

      1. PrivateSub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
      2. Dim rand = ((form1.Width - form1.ClientSize.Width) / 2) 'linker, rechter und unterer Rand
      3. Dim rand2 = (((form1.ClientSize.Height + rand) - form1.Height)) 'oberer Rand berechnen
      4. me.Left = form1.Left + form1.ClientRectangle.Left + rand'Position links
      5. me.Width = form1.ClientSize.Width'breite der Verdunkelung
      6. me.Top = form1.Top + form1.ClientRectangle.Top - rand2'Position von oben
      7. me.Height = form1.ClientSize.Height 'Höhe der Verdunkelung
      8. EndSub

      Variante2: Der ganze Bildschirm soll verdunkelt werden.

      VB.NET-Quellcode

      1. Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      2. Me.WindowState = FormWindowState.Maximized
      3. End Sub


      In den Button der Form1 schreibt Ihr einfach:

      VB.NET-Quellcode

      1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      2. Form3.Show()
      3. Form2.Show()
      4. End Sub



      Damit wird erst unser "Verdunkeler" und dann unser Dialog geöffnet.
      In den "Abbrechen"-Button der Form2 schreibt Ihr einfach

      VB.NET-Quellcode

      1. Me.Close()
      2. Form3.Close()



      Damit klappt es bereits, wenn Ihr jetzt noch wollt, dass Form2 in der Mitte der Form1 erscheint, habe ich folgenden Code erstellt:

      VB.NET-Quellcode

      1. Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      2. Me.Left = (Form1.Width / 2) + Form1.Left - (Me.Width / 2)
      3. Me.Top = (Form1.Height / 2) + Form1.Top - (Me.Height / 2)
      4. End Sub


      Nun ist es aber so, dass bei Klick auf Form3 (also unserer Verdunkeler) die Form2 in den Hintergrund gerät, dazu mach Ihr einfach folendes:

      VB.NET-Quellcode

      1. Private Sub Form3_Click()
      2. form2.hide
      3. form2.show
      4. end sub



      Wenn Ihr jetzt noch wollt, dass sich alles bei Verschieben des Hauptfensters mit bewegt (sonst fürden Form2 und Form3 stehen bleiben), dann nehmt noch folgenden Code:


      VB.NET-Quellcode

      1. Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChangedForm3.Left = Me.Left
      2. Form3.Width = Me.WidthForm3.Height = Me.Height - 27
      3. Form3.Top = Me.Top + 27Form2.Left = (Me.Width / 2) + Me.Left - (Form2.Width / 2)
      4. Form2.Top = (Me.Height / 2) + Me.Top - (Form2.Height / 2)
      5. End Sub


      Und damit wären wir am Ende!
      Verzeiht mir, dass ich es so "idiotensicher" beschrieben habe, aber ich wollte dass auch Anfänger dies Verstehen und nutzen können!

      Viele Grüße

      VanDerLars
      Bilder
      • Verdunkelung.png

        93,35 kB, 1.100×690, 1.410 mal angesehen
      • Unbenannt.png

        68,59 kB, 1.111×638, 1.237 mal angesehen

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

      schön un gut, dass du die Titelleiste freilässt, aber es sieht an den Rändern scheiße aus, da diese nicht ausgelassen werden. Da sollte man dann mit ClientSize arbeiten. Außerdem ist nicht bei jedem die Titelleiste gleich groß. Ich denke hier ließe sich schon was machen mit GDI oder API, aber deine Variante ist etwas einfacher, dafür etwas unschöner ;)
      Türlich geht es mit GDI, und türlich ist es schöner! Aber dafür auch viiieeel schwerer. Was die Ränder angeht, das lässt sich sicher mit clientsize besser lösen, das stimmt.
      Aber ich wollte halt eine einfache Alternetive bieten. Als ich noch Anfänger war (was ich eigentlich auch noch bin), habe ich mich immer diese komplizierten Lösungen aufgeregt, die das Forum hier "ausspuckt"^^

      Indes: Wenn man die Form 3 einfach auf Windowstate = Maximized stellt, dann sieht es keiner und es sieht auch, als ob Windows uns etwas sagen möchte!
      Was ist dass für ein Programm in den du dass Beispiel ausführts, kann ich es haben??
      @ zn-gong:
      das ist ein Intranet-Programm, mit dem Firmen sich ohne Webbrowser und Programmieraufwand ein eigenes Intranet mit integriertem Sozialem Netzwerk erschaffen können. Ist gerade in der Testphase in zwei Unternehmen.

      Danach ist es nur Preissache^^
      EDIT:

      habe den Code im ersten Post nun verändert. Die Verdunkelungsform wird nun innerhalb der Clientsize der Hauptform angezeigt, somit erübrigt sich das Auslassen der Titelleiste und alles wirkt insgesamt professioneller!
      Man kann, wenn man nur die Hauptform verdunkeln will, es auch viel einfacher machen.

      VB.NET-Quellcode

      1. Me.Bounds = mainForm.ClientRectangle

      (Wobei mainForm die Instanz der Hauptform ist)
      Außerdem: Benutze bitte nicht eine Klasse als Instanz, da das ein Tutorial ist und die Leute etwas lernen sollen und nicht falsche Dinge.

      EDIT: Du solltest auch noch einbauen, dass sich die verdunkelte Form mit der Hauptform bewegt ;).