| |
VB.NET - FortgeschritteneAnaloges Anzeigeinstrument mit GDI+ | | | Autor: MikeJ | Datum: 04.12.07 21:46 |
| Mahlzeit
ich habe mir über die Funktionen des GDI+ eine Klasse für ein Analoges Anzeigeinstrument (so wie der Tacho im Auto) erstellt. Das Instrument wird auf ein Pitmap in einer Picturebox gezeichnet. Bei Wertänderung wird das Bitmap neu gezeichnet, und die Anzeige "refresht". Das Funktioniert recht gut - bis ich eine 2. Picturebox hinzufüge, und eine weitere Instanz der Klasse erzeuge. Dann ist die Anzeige "stotternd" und sehr langsam.
Gibt es für solche Zwecke evtl etwas geeigneteres als das GDI+, oder gibt es eine bessere (schnellere) Methode, um die Grafik zu aktualisieren?
Gibt es evtl schon fertige Anzeigeinstrumente, welche ich in mein Programm einbinden könnte?
Viele Grüße
Mike | |
Re: Analoges Anzeigeinstrument mit GDI+ | | | Autor: Snof | Datum: 04.12.07 21:50 |
| Hallo,
lässt du die ganze Picturebox neu zeichnen oder nur Ausschnitte? | |
Re: Analoges Anzeigeinstrument mit GDI+ | | | Autor: GPM | Datum: 04.12.07 22:09 |
| Eventuell das Instrument ohne Zeiger als BackGroundImage in die PictureBox einfügen
Den fertigen Zeiger dann an die gewünschte Position mit DrawPicture und RotateTransform nur noch hinzufügen.
MfG GPM | |
Re: Analoges Anzeigeinstrument mit GDI+ | | | Autor: MikeJ | Datum: 05.12.07 10:27 |
| hi
hier http://s160492259.online.de/Upload/Anzeige.JPG habe ich mal ein Bild hinterlegt, wie die Anzeige aussieht (oberes Bild). Aus den beiden Bildern darunter wird sie erstellt, indem ich über einen DrawArc Befehl mit einer Texture Brush jeweils einen Kreisabschnitt des Vor- und Hintergrundbildes Zeichne.
Zum Zeichnen verwende ich den Folgenden Code:
Private Sub UpdateValue()
Dim bmp As New Bitmap(ctrl.Width, ctrl.Height) 'Das Bitmap für die
' Zeichnung
Dim PenScale As New Pen(ForColor, 2) 'Stift für Scala
Dim txpBackround As New TextureBrush(My.Resources.AnzeigeGrün) _
'Farbverlauf für Hintergrund
Dim txpForground As New TextureBrush(My.Resources.AnzeigeGrau) _
'Farbverlauf für Vordergrund
Dim penBackround As New Pen(txpBackround, 10) 'Stift mit Farbverlauf
' Hintergrund
Dim penForground As New Pen(txpForground, 10) 'Stift mit Farbverlauf
' Vordergrund
Dim Winkel As Integer 'Winkel für Skalierung
Dim PointX As Point 'Scale-Strich Anfang
Dim PointY As Point 'Scale-Strich Ende
ctrl.Image = bmp 'Der Picturebox das Bild zuweisen
'Schreiben des Wertes in das mittlere Label
lblValue.Text = CStr(Value) 'Text
lblValue.Left = CInt(ctrl.Width / 2 - lblValue.Width / 2) _
'Positionskorrektur un X und Y
lblValue.Top = CInt(ctrl.Height / 2 - lblValue.Height / 2)
'Kontrolle, ob Value zwischen Min und Max liegt
If Value < scaleMin Then
Value = scaleMin
ElseIf Value > scaleMax Then
Value = scaleMax
End If
'Min Wert abziehen, damit Anzeige bei 0 beginnt
Value -= scaleMin
'Zeichnung der Scala
Using ctrlGraph As Graphics = Graphics.FromImage(bmp)
'Scaleneinteilung
For Winkel = 135 To 405 Step 45 'Alle 45° ein Strich
With PointX 'Anfangspunkt auf dem Aussenkreis der Skala
.X = CInt(1.05 * (Radius - Abstand) * Cos(Winkel * PI / _
180) + Mitte.X)
.Y = CInt(1.05 * (Radius - Abstand) * Sin(Winkel * PI / _
180) + Mitte.Y)
End With
With PointY 'Endpunkt 10% ausserhalb des Aussenkreis der Skala
.X = CInt(1.15 * (Radius - Abstand) * Cos(Winkel * PI / _
180) + Mitte.X)
.Y = CInt(1.15 * (Radius - Abstand) * Sin(Winkel * PI / _
180) + Mitte.Y)
End With
'With ctrlGraph
With ctrlGraph
.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality
.DrawLine(PenScale, PointX, PointY)
End With
Next
Select Case Style
Case 1 'Style 1
With ctrlGraph 'Gaph anzeigen
.SmoothingMode = _
Drawing.Drawing2D.SmoothingMode.HighQuality
.DrawArc(penForground, RectPix(RectPrc(Frame, Prcsize), _
Abstand), CSng(135 + Value * DecPerUnit), CSng(270 - _
Value * DecPerUnit))
.DrawArc(penBackround, RectPix(RectPrc(Frame, Prcsize), _
Abstand), CSng(135), CSng(Value * DecPerUnit))
'.DrawArc(Pens.Pink, RectPix(RectPrc(Frame, Prcsize),
' Abstand), CSng(135 - Rundung), CSng(Value *
' DecPerUnit + Rundung + Rundung))
End With
End Select
'ctrlGraph.Dispose() 'Resourcen freigeben
End Using
ctrl.Refresh()
End Sub | |
Re: Analoges Anzeigeinstrument mit GDI+ | | | Autor: GPM | Datum: 05.12.07 13:02 |
| Ich würde eine fertiges Bild mit Scala als Hintergrund nehmen.
Dann nur noch Zeiger und Drehzahl neu zeichnen. Ein Ansatz:
Imports System.Drawing.Drawing2D
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
Ctrl.BackgroundImage = My.Resources.HGrund ' Hintergrundbild mit
' fertiger Scala (200x200)
End Sub
Private Sub Ctrl_Paint(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles Ctrl.Paint
Dim value As Int32 = TrackBar1.Value '0-7000
Using tb As New TextureBrush(My.Resources.FGrund), p As New Pen(tb, _
10), f As New Font("Arial", 16, FontStyle.Bold)
e.Graphics.SmoothingMode = _
Drawing.Drawing2D.SmoothingMode.HighQuality
e.Graphics.TextRenderingHint = _
Drawing.Text.TextRenderingHint.AntiAlias
e.Graphics.DrawArc(p, 36, 36, 125, 125, 135, value \ 26)
e.Graphics.DrawString((10 * (value \ 10)).ToString.PadLeft(4, "0"), _
f, Brushes.Yellow, 75, 85)
End Using
End Sub
Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles TrackBar1.Scroll
' TrackBar1 Min 0, Max(7000) zum testen
Ctrl.Invalidate(New Rectangle(35, 35, 132, 132)) ' Nur den
' Zeigerbereich neuzeichnen
End Sub
End Class MfG GPM | |
Re: Analoges Anzeigeinstrument mit GDI+ | | | Autor: MikeJ | Datum: 05.12.07 17:15 |
| Mahlzeit
Ich hab das Problem gefunden: Das Bitmap!
Wenn ich direkt auf ein Frame Zeichne funktioniert es einwandfrei ohne ruckeln. Dann ist nur das Label in der Mitte und meine Uhrzeit, welche ich über einen Timer Zyklisch aktualisiere langsam (Sec der Uhr springt z.B. von 13:12:05 auf 13:12:11 weil das Timer-Event während des zeichnen nicht ausgeführt wird).
Wenn hierfür noch jemand einen Tipp hat bin ich sehr Dankbar ansonsten Vielen Dank für die Hilfe!
Gruß Mike | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevGraph (VB/VBA)
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere Infos
|