|
| Autor |
Nachricht |
heinkurz Newbie

Anmeldedatum: 07.12.2010 Beiträge: 2 Wohnort: Wien
|
VB2010 Grafiken
Verfasst am: 07.12.2010, 23:13 |
|
|
Ich werd noch wahnsinnig weil ich im Web nichts vernünftiges zu Grafiken in VB2010 finde. Mein Problem ist, dass ein auf die Form gezeichnete Grafik beim Me.Refresh() gelöscht wird. Wie kann ich sowas wie AutoRedraw() bei VB6 unter VB2010 erreichen?
Beispielcode einer analogen Uhr:
Es ist nur eine normale Form samt einem Timer erforderlich.
---
Public Class Form1
Public x0, y0, r, rs, rm, rh As Integer ' Mittenkoordinaten, Radien
Public g As Graphics
Public m_Face As Bitmap
Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
DrawFace()
Timer1.Interval = 200
Timer1.Enabled = True
End Sub
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim s, m, h, x1, y1 As Integer ' Zeitwerte, Zeigerkoordinaten
If m_Face Is Nothing Then Exit Sub
' Ziffernblatt
e.Graphics.DrawImage(m_Face, 0, 0)
s = Int(Math.PI / 30 * Now.Second) ' Winkel s
m = Int(Math.PI / 30 * Now.Minute) ' Winkel m
h = Int(Math.PI / 6 * Now.Hour) ' Winkel h
' Textlabel mit Uhrzeit
' LabelTime.Text = Now.ToString
' Pens generieren
Dim hour As New Pen(Color.Blue)
Dim minute As New Pen(Color.Red)
Dim second As New Pen(Color.Black)
hour.Width = 8
minute.Width = 4
second.Width = 1
' alte Zeiger löschen
Dim pinsel As New SolidBrush(Me.BackColor)
g.FillEllipse(pinsel, x0 - rs, y0 - rs, rs * 2, rs * 2)
' Zeiger zeichnen
x1 = Int(x0 + rh * Math.Sin(h) + 0.5)
y1 = Int(y0 - rh * Math.Cos(h) + 0.5)
g.DrawLine(hour, x0, y0, x1, y1)
x1 = Int(x0 + rm * Math.Sin(m) + 0.5)
y1 = Int(y0 - rm * Math.Cos(m) + 0.5)
g.DrawLine(minute, x0, y0, x1, y1)
x1 = Int(x0 + rs * Math.Sin(s) + 0.5)
y1 = Int(y0 - rs * Math.Cos(s) + 0.5)
g.DrawLine(second, x0, y0, x1, y1)
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Me.Invalidate()
End Sub
Private Sub DrawFace()
' Ziffernblatt zeichnen
m_Face = New Bitmap(Me.ClientRectangle.Width, Me.ClientRectangle.Height)
Dim g As Graphics = Graphics.FromImage(m_Face)
Dim stifth As New Pen(Color.Black)
Dim i As Integer
x0 = Int(Me.ClientRectangle.Width / 2)
y0 = Int(Me.ClientRectangle.Height / 2)
r = IIf(x0 < y0, x0 * 0.9, y0 * 0.9) ' radius
rs = r * 0.9
rm = r * 0.8
rh = r * 0.6
stifth.Width = 5
'g = Me.CreateGraphics
For i = 0 To 360 Step 6 ' Minuten
g.DrawPie(Pens.Black, x0 - r, y0 - r, r * 2, r * 2, i, 360)
Next
For i = 0 To 360 Step 30 ' Stunden
g.DrawPie(stifth, x0 - r, y0 - r, r * 2, r * 2, i, 360)
Next
Dim pinsel As New SolidBrush(Me.BackColor)
g.FillEllipse(pinsel, x0 - rs, y0 - rs, rs * 2, rs * 2)
' Ziffernblatt anzeigen
Me.BackgroundImage = m_Face
End Sub
End Class
--- |
|
| |
|
 |
Hexer Newbie

Anmeldedatum: 16.12.2010 Beiträge: 2
|
Verfasst am: 16.12.2010, 20:52 |
|
|
Hallo,
also ich muß Dich enttäuschen, aber so weit ich weiß gibt es in VB.NET keine AutoRedraw-Funktion mehr. Das heißt Du wirst in den sauren Apfel beißen müssen.
Du mußt den ganzen Kram erst in eine virtuelle Bitmap zeichnen. Und auf das Repaint-Ereignis der Form lädst Du die Bitmap aus dem Speicher auf die Form:
| Code: | Public Class Form1
Dim g As Graphics
Dim Buffer As Bitmap
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Buffer = New Bitmap(Width, Height, CreateGraphics)
g = Graphics.FromImage(Buffer)
g.DrawLine(Pens.Fuchsia, 10, 20, 31, 41)
Refresh()
End Sub
Private Sub Form1_Paint(ByVal Sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint
If Not (Buffer Is Nothing) Then
e.Graphics.DrawImage(Buffer, 0, 0)
End If
End Sub
End Class
|
Du solltest allerdings des Erstellen der Bitmaps zunächst in den Konstruktor der Form legen. Ich habe das aus Zeitgründen einfach mal in das Button1_Click-Ereignis gepackt. Ich hoffe, das hilft Dir?
Gruß,
Der Hexer! |
|
| |
|
 |
|
|