Rubrik: Grafik und Font | VB-Versionen: VB.NET | 18.03.05 |
Ein CPU-Chart mit GDI+ Dieser Tip zeigt Ihnen wie man mit ein paar Tricks einen dem Task Manager ähnlichen CPU Chart direkt auf dem Desktop zeichnen kann. | ||
Autor: Stefan Mähr | Bewertung: | Views: 20.057 |
www.visualsoft-net.de | System: WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Dieser Tip zeigt Ihnen wie man mit ein paar Tricks einen dem Task Manager ähnlichen CPU Chart direkt auf dem Desktop zeichnen kann.
Dazu legen Sie ein neues Windows-Form-Projekt an und nennen es zum Beispiel CPUToDesktop.
Formeinstellungen:
- Height: 300
- Width: 80
Fügen Sie dem Form einen System-Timer mit folgenden Einstellungen hinzu:
- Name: tmrMain
- Enabled: False
- Interval: 1000
Um das Forumlar unsichtbar zu machen und trotzdem noch darauf zeichnen zu können bedienen wir uns einiger neuer Einstellungen der Winform:
- Setzen Sie die BackColor-Eigenschaft des Formulares auf: 255; 192; 255
- Setzen Sie die TransparencyKey-Eigenschaft des Forumlares ebenfalls auf: 255; 192; 255
- Setzen Sie die FormBorderStyle-Eigenschaft auf None
Wenn Sie das Projekt jetzt kompilieren werden Sie feststellen, dass kein Formular sichtbar wird.
Nun kommen wir zum Source-Code:
Zuerst unsere für das Formular global verfügbare Variablen:
Private perfCounter As System.Diagnostics.PerformanceCounter Private gDraw As Graphics Private fnt As Font Private lngFntHeight As Long Private lngFntX As Long Private fillBrsh As SolidBrush Dim brsh As SolidBrush
Das Form Load Ereignis:
Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Dim rectF As SizeF ' --> Der Performance Counter wird verwendet um die CPU Last auszulesen perfCounter = New System.Diagnostics.PerformanceCounter perfCounter.CategoryName = "Processor" perfCounter.CounterName = "% Processor Time" perfCounter.InstanceName = "_Total" ' --> Formular im Linken unteren Bereich des Bildschirms ausrichten Me.Location = New Point(Screen.PrimaryScreen.WorkingArea.Width - Me.Width - 5, _ Screen.PrimaryScreen.WorkingArea.Height - Me.Height - 5) Me.Width = 80 ' --> Font für die CPU Auslastung fnt = New Font("Arial", 14, FontStyle.Bold, GraphicsUnit.Pixel) ' --> String ausmessen rectF = MeasureTheString() lngFntHeight = rectF.Height ' --> Ausrichtung der Schrift auf der X-Achse lngFntX = Me.Width - rectF.Width ' --> GDI Objekte fillBrsh = New SolidBrush(Color.FromArgb(0, 255, 0)) brsh = New SolidBrush(Color.FromArgb(255, 192, 255)) gDraw = Me.CreateGraphics ' --> Form im Vordergrund Me.TopMost = True Me.tmrMain.Enabled = True End Sub
Die Funktion die Die CPU Last liefert:
' --> Funktion für das Auslesen der CPU Auslastung über ' --> einen Performance Counter Private Function GetCPULoad() As Integer Return Integer.Parse(Format(perfCounter.NextValue, "##0")) End Function
Hilfsfunktion für das Ausmessen eines Strings als SizeF-Struktur:
' --> Funktion für das Ausmessen eines Strings Private Function MeasureTheString() As SizeF Dim g As Graphics = Me.CreateGraphics Dim retValue As SizeF retValue = g.MeasureString("100 %", fnt) g.Dispose() Return retValue End Function
Das Timer-Event:
Private Sub tmrMain_Elapsed(ByVal sender As System.Object, _ ByVal e As System.Timers.ElapsedEventArgs) Handles tmrMain.Elapsed Call repaintForm() End Sub
Die eigentliche Zeichenroutine:
' --> Die eigentliche Zeichnenfunktion Private Sub repaintForm() Dim intRectHeight As Integer = 2 Dim intSpace As Integer = 1 Dim intRectWidth As Integer = 80 Dim intCPULoad As Integer = GetCPULoad() ' --> Löschen des FormInhaltes gDraw.Clear(Color.FromArgb(255, 192, 255)) ' --> Zeichnen der Rectangles ' (ein Rectangle für jedes Prozent CPU Auslastung) For idx As Integer = 0 To intCPULoad - 1 gDraw.FillRectangle(fillBrsh, 0, (Me.Height - intRectHeight - _ (lngFntHeight + 2)) - idx * (intRectHeight + intSpace), _ Me.Width, intRectHeight) Next ' --> Zeichnen der CPU Auslastung als Text gDraw.DrawString(intCPULoad.ToString & " %", fnt, fillBrsh, _ lngFntX, Me.Height - lngFntHeight) End Sub
Das Aufräumen:
' --> GDI Objekte zerstören Private Sub Form1_Closed(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Closed gDraw.Dispose() fillBrsh.Dispose() brsh.Dispose() End Sub