Hallo erstmal.
Ich wollte schon immer eigene Controls. Bloß mit Pictureboxen wollte ich es nicht machen, weil es blöd aussieht und schlecht zu handhaben ist.
Also habe ich mal gegooglet und herausgefunden, wie man eigene Controls zeichnet.
Diese Technik kann man für alle Controls verwenden. (Form, Progressbar, Button, Textbox, etc)
Hier erkläre ich aber, wie man eine eigene Form zeichnet.
Und da schon viele hier gefragt haben, habe ich mal ein Tut dafür gemacht.
In den Spoilern ist der jeweilige abschnitt.
ACHTUNG!!! Copy&Paste wird hier nicht unterstützt. Ich erkläre alles, damit ihr was lernt!!!!!
Schritt 1:
Als erstes erstellen wir ein neues Projekt mit einer "Class Libary".
Schritt 2:
Zum zeichnen importieren wir System.Windows.Forms, System.Drawing.Drawing2D und System.Drawing.
Wenn ein Fehler auftritt, fügt dem Projekt eine Form hinzu. Direkt danach könnt ihr sie wieder löschen.
Schritt 3:
Das Programm muss auch noch wissen, von was es erben soll.
Also Inherits Form. (Oder Inherits Progressbar, Button, Listbox)
Schritt 4:
Natürlich soll das Programm wissen, dass wir es selbst zeichnen.
Dafür erstellen wir den Sub "Public Sub New" und machen dort ein paar Einstellungen (Siehe Code)
Spoiler anzeigen
Schritt 5:
Somit haben wir die Grundlagen. Jetzt kommt der Part, wo wir die Form (bzw. das Control) zeichnen.
Dies erfolgt in einem Sub, der auslöst, wenn die Form neu gezeichnet wird.
Als erstes legen wir aber unsere Zeichenqualität fest.
Schritt 6:
Jetzt könnt ihr eurer Fantasie freien lauf lassen xD
Gezeichnet wird mit "e.Graphics.Draw..."
Spoiler anzeigen
Schritt 7:
So, die Form ist gezeichnet, aber lässt sich nicht verschieben.
Dies lösen wir, indem wir temporär diePosition der Maus und der Fensters speichern und bei einer bewegung die Diferenz ausrechnen und anwenden.
Spoiler anzeigen
Schritt 8:
Dies ist vorerst der letzte Schritt.
Das Schließen der Form.
Dass machen wir wie in Schritt 7 ("MetroFormxd_MouseDown"), nur mit anderen Koordinaten.
Den Code fügen wir auch in den gleichen Sub wie in Schritt 7 ("MetroFormxd_MouseDown").
Spoiler anzeigen
Zum Schluss nochmal der ganze Code an einem Stück.
Und denkt bitte dran. Von Copy&Paste lernt ihr rein gar nichts. Spätestens beim nächsten mal habt ihr es wieder vergessen und sucht den Link.
Spoiler anzeigen
Ich hoffe och konnte wenigstens einigen helfen xD
Ich wollte schon immer eigene Controls. Bloß mit Pictureboxen wollte ich es nicht machen, weil es blöd aussieht und schlecht zu handhaben ist.
Also habe ich mal gegooglet und herausgefunden, wie man eigene Controls zeichnet.
Diese Technik kann man für alle Controls verwenden. (Form, Progressbar, Button, Textbox, etc)
Hier erkläre ich aber, wie man eine eigene Form zeichnet.
Und da schon viele hier gefragt haben, habe ich mal ein Tut dafür gemacht.
In den Spoilern ist der jeweilige abschnitt.
ACHTUNG!!! Copy&Paste wird hier nicht unterstützt. Ich erkläre alles, damit ihr was lernt!!!!!
Schritt 1:
Als erstes erstellen wir ein neues Projekt mit einer "Class Libary".
Schritt 2:
Zum zeichnen importieren wir System.Windows.Forms, System.Drawing.Drawing2D und System.Drawing.
Wenn ein Fehler auftritt, fügt dem Projekt eine Form hinzu. Direkt danach könnt ihr sie wieder löschen.
Schritt 3:
Das Programm muss auch noch wissen, von was es erben soll.
Also Inherits Form. (Oder Inherits Progressbar, Button, Listbox)
Schritt 4:
Natürlich soll das Programm wissen, dass wir es selbst zeichnen.
Dafür erstellen wir den Sub "Public Sub New" und machen dort ein paar Einstellungen (Siehe Code)
VB.NET-Quellcode
- Public Sub New()
- MyBase.New()
- MyBase.SetStyle(ControlStyles.UserPaint, True) 'Sagt, dass wir selbst zeichnen
- MyBase.SetStyle(ControlStyles.DoubleBuffer, True) 'Sagt, dass die Form doppelt gebuffert wird
- MyBase.SetStyle(ControlStyles.SupportsTransparentBackColor, True) 'Eigentlich unwichtig. Sagt, dass Transparenter Hintergrund unterstützt wird
- End Sub
Schritt 5:
Somit haben wir die Grundlagen. Jetzt kommt der Part, wo wir die Form (bzw. das Control) zeichnen.
Dies erfolgt in einem Sub, der auslöst, wenn die Form neu gezeichnet wird.
Als erstes legen wir aber unsere Zeichenqualität fest.
Schritt 6:
Jetzt könnt ihr eurer Fantasie freien lauf lassen xD
Gezeichnet wird mit "e.Graphics.Draw..."
VB.NET-Quellcode
- e.Graphics.FillRectangle(Brushes.White, 0, 0, MyBase.Width - 1, MyBase.Height - 1) 'Die Form ansich
- e.Graphics.DrawRectangle(Pens.DarkGray, 0, 0, MyBase.Width - 1, MyBase.Height - 1) 'Rahmen um die Form
- e.Graphics.DrawRectangle(Pens.DarkGray, 0, 0, MyBase.Width - 1, 23) 'Die Leiste oben
- e.Graphics.DrawIcon(MyBase.Icon, New Rectangle(1, 1, 23, 23)) 'Zeichnet das Icon in der Leiste
- e.Graphics.DrawString(MyBase.Text, New Font("Arial", 12), Brushes.Black, 24, 3) 'Zeichnet den Titel des Fenster
- e.Graphics.DrawString("Schließen", New Font("Arial", 10), Brushes.Black, MyBase.Width - 70, 4) 'Zeichnet das "Schließen", kann auch Bild sein
Schritt 7:
So, die Form ist gezeichnet, aber lässt sich nicht verschieben.
Dies lösen wir, indem wir temporär diePosition der Maus und der Fensters speichern und bei einer bewegung die Diferenz ausrechnen und anwenden.
VB.NET-Quellcode
- Private Sub MetroFormxd_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown 'Wenn Maustaste gedrückt wird
- If MousePosition.X > MyBase.Location.X And MousePosition.X < MyBase.Location.X + (MyBase.Width- 70) Then 'Wenn zwischen Anfang und Ende der Form in X-Richtung
- If MousePosition.Y > MyBase.Location.Y And MousePosition.Y < MyBase.Location.Y + 23 Then 'Wenn zwischen Anfang und Ende der Form in Y-Richtung
- temp_mouse_X = MousePosition.X 'Dann Positionen temporär speichern
- temp_mouse_Y = MousePosition.Y
- temp_windo_X = MyBase.Location.X
- temp_windo_Y = MyBase.Location.Y
- schieben = True ' Und speichern, dass verschoben wird
- End If
- End If
- End Sub
- Private Sub MetroFormxd_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove 'Wenn Maus bewegt wird
- If schieben = True Then 'Wenn die Form verschoben wird
- Dim tx As Integer = MousePosition.X - temp_mouse_X 'Dann differenz ausrechnen
- Dim ty As Integer = MousePosition.Y - temp_mouse_Y
- Dim sx As Integer = temp_windo_X + tx 'Und anwenden
- Dim sy As Integer = temp_windo_Y + ty
- MyBase.Location = New Point(sx, sy) 'Neue Position anwenden
- End If
- End Sub
- Private Sub MetroFormxd_MouseUp(sender As Object, e As MouseEventArgs) Handles Me.MouseUp 'Wenn Maustaste losgelassen wird
- schieben = False 'Dann speichern, dass das Fenster nicht verschoben wird
- End Sub
Schritt 8:
Dies ist vorerst der letzte Schritt.
Das Schließen der Form.
Dass machen wir wie in Schritt 7 ("MetroFormxd_MouseDown"), nur mit anderen Koordinaten.
Den Code fügen wir auch in den gleichen Sub wie in Schritt 7 ("MetroFormxd_MouseDown").
VB.NET-Quellcode
- If MousePosition.X > (MyBase.Width - 70) And MousePosition.X < MyBase.Width Then 'Wenn zwischen Anfang und Ende von "Schließen" in X-Richtung
- If MousePosition.Y > MyBase.Location.Y And MousePosition.Y < MyBase.Location.Y + 23 Then 'Wenn zwischen Anfang und Ende von Leiste in Y-Richtung
- Application.Exit() 'Dann Application schließen (Wenn noch andere Fenster offen von gleichem Projekt werden die auch geschlossen)
- End If
- End If
Zum Schluss nochmal der ganze Code an einem Stück.
Und denkt bitte dran. Von Copy&Paste lernt ihr rein gar nichts. Spätestens beim nächsten mal habt ihr es wieder vergessen und sucht den Link.
VB.NET-Quellcode
- Imports System.Windows.Forms
- Imports System.Drawing.Drawing2D
- Imports System.Drawing
- Public Class MetroFormxd
- Inherits Form
- Dim schieben As Boolean = False
- Dim temp_mouse_X As Integer
- Dim temp_mouse_Y As Integer
- Dim temp_windo_X As Integer
- Dim temp_windo_Y As Integer
- Public Sub New()
- MyBase.New()
- MyBase.SetStyle(ControlStyles.UserPaint, True)
- MyBase.SetStyle(ControlStyles.DoubleBuffer, True)
- MyBase.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
- End Sub
- Private Sub MetroFormxd_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
- If MousePosition.X > MyBase.Location.X And MousePosition.X < MyBase.Location.X + (MyBase.Width - 70) Then
- If MousePosition.Y > MyBase.Location.Y And MousePosition.Y < MyBase.Location.Y + 23 Then
- temp_mouse_X = MousePosition.X
- temp_mouse_Y = MousePosition.Y
- temp_windo_X = MyBase.Location.X
- temp_windo_Y = MyBase.Location.Y
- schieben = True
- End If
- End If
- If MousePosition.X > (MyBase.Width - 70) And MousePosition.X < MyBase.Width Then
- If MousePosition.Y > MyBase.Location.Y And MousePosition.Y < MyBase.Location.Y + 23 Then
- Application.Exit()
- End If
- End If
- End Sub
- Private Sub MetroFormxd_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
- If schieben = True Then
- Dim tx As Integer = MousePosition.X - temp_mouse_X
- Dim ty As Integer = MousePosition.Y - temp_mouse_Y
- Dim sx As Integer = temp_windo_X + tx
- Dim sy As Integer = temp_windo_Y + ty
- MyBase.Location = New Point(sx, sy)
- End If
- End Sub
- Private Sub MetroFormxd_MouseUp(sender As Object, e As MouseEventArgs) Handles Me.MouseUp
- schieben = False
- End Sub
- Private Sub Grafik(ByVal sender As Object, ByVal e As PaintEventArgs) Handles MyBase.Paint
- e.Graphics.SmoothingMode = SmoothingMode.HighQuality
- e.Graphics.FillRectangle(Brushes.White, 0, 0, MyBase.Width - 1, MyBase.Height - 1)
- e.Graphics.DrawRectangle(Pens.DarkGray, 0, 0, MyBase.Width - 1, MyBase.Height - 1)
- e.Graphics.DrawRectangle(Pens.DarkGray, 0, 0, MyBase.Width - 1, 23)
- e.Graphics.DrawIcon(MyBase.Icon, New Rectangle(1, 1, 23, 23))
- e.Graphics.DrawString(MyBase.Text, New Font("Arial", 12), Brushes.Black, 24, 3)
- e.Graphics.DrawString("Schließen", New Font("Arial", 10), Brushes.Black, MyBase.Width - 70, 4)
- End Sub
- End Class
Ich hoffe och konnte wenigstens einigen helfen xD