Visual Basic Forum

Visual Basic Forum
für VB6 und VB.NET Programmierer
 
RegistrierenRegistrieren  LoginLogin
Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB.NET] Fragen - Antworten
Autor
Nachricht
heinkurz
Newbie
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
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!
 
Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB.NET] Fragen - Antworten

Tags: grafik, vb2010, drawline, zeichnen, löschen

 
 Verwandte Themen   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge [Frage] Ich bekomme einen Fehler das "End if" fehlt obwohl e 699 14.09.2008, 16:33
Keine neuen Beiträge Komponenten registrieren mit Sub Main 1244 21.05.2008, 10:28
Keine neuen Beiträge sub bedingt aufrufen 584 13.05.2008, 08:12
Keine neuen Beiträge [Text] Komponenten registrieren mit Sub Main 1741 26.04.2008, 13:45
Keine neuen Beiträge Melt sub / anti sandboxie usw 1182 14.04.2008, 18:39
 


[ Time: 0.0803s ][ Queries: 83 (0.0406s) ][ GZIP on - Debug on ]