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".
Hier klicken für weitere Informationen
|
Visual Basic Quellcode
|
1
2
|
Public Class Class1
End Class
|
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.
Hier klicken für weitere Informationen
|
Visual Basic Quellcode
|
1
2
3
|
Imports System.Windows.Forms
Imports System.Drawing.Drawing2D
Imports System.Drawing
|
Schritt 3:
Das Programm muss auch noch wissen, von was es erben soll.
Also Inherits Form. (Oder Inherits Progressbar, Button, Listbox)
Hier klicken für weitere Informationen
|
Visual Basic Quellcode
|
1
|
Inherits Form
|
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)
Hier klicken für weitere Informationen
|
Visual Basic Quellcode
|
1
2
3
4
5
6
|
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.
Hier klicken für weitere Informationen
|
Visual Basic Quellcode
|
1
2
3
|
Private Sub Grafik(ByVal sender As Object, ByVal e As PaintEventArgs) Handles MyBase.Paint
e.Graphics.SmoothingMode = SmoothingMode.HighQuality
End Sub
|
Schritt 6:
Jetzt könnt ihr eurer Fantasie freien lauf lassen xD
Gezeichnet wird mit "e.Graphics.Draw..."
Hier klicken für weitere Informationen
|
Visual Basic Quellcode
|
1
2
3
4
5
6
|
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.
Hier klicken für weitere Informationen
|
Visual Basic Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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").
Hier klicken für weitere Informationen
|
Visual Basic Quellcode
|
1
2
3
4
5
|
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.
Hier klicken für weitere Informationen
|
Visual Basic Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
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