vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Analoges 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel