Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0460: 3D-Kuchendiagramme mit der Pie-Api realisieren

 von 

Beschreibung 

Mit der Pie-Api lassen sich nur flache Kreis/Kuchendiagramme erstellen. Wenn man allerdings ein zweites leicht versetzt dazu zeichnet, bekommt es einen schönen 3D Effekt, wie in den Datenträger-Eigenschaften vom Explorer.

Update am 23. September 2004 von Thomas und Tobias Rebele: Der Tipp wurde an einigen Stellen verbessert, so dass 100% nun wirklich als 100% angezeigt wird und die 3D-Effekte realistischer wirken.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

Pie

Download:

Download des Beispielprojektes [2,4 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Projekt1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Bildfeld-Steuerelement "Picture1"
'Autor: Jan Thiede
'E-Mail: jan.thiede@web.de
'Hinweis: Teile dieser Source wurden aus einer Delphi-Funktion nach VB umgeschrieben

Option Explicit

Private Declare Function Pie Lib "gdi32" ( _
    ByVal hdc As Long, ByVal X1 As Long, _
    ByVal Y1 As Long, ByVal X2 As Long, _
    ByVal Y2 As Long, ByVal X3 As Long, _
    ByVal Y3 As Long, ByVal X4 As Long, _
    ByVal Y4 As Long) As Long
    
Private Const PI = 3.14159265


Public Sub PaintPie(ByRef oPicBox As PictureBox, _
    ByVal dblValue As Double, _
    ByVal dblMax As Double)
    
    Dim nWidth As Integer, nHeight As Integer, nDeep As Integer
    Dim nLeft As Integer, nTop As Integer
    
    Dim nWinkel As Double, nGrad As Double
    Dim dblX1 As Double, dblY1 As Double
    
    Dim i As Integer
    
    'Farben
    Const DarkMagenta = 8388736
    Const DarkBlue = 8388608
    
    With oPicBox
    'Ein paar Einstellungen setzen
    .Cls
    .AutoRedraw = True
    .ScaleMode = vbPixels
    .ForeColor = vbBlack
    .DrawWidth = 1
    .FillStyle = vbSolid

    'Die Höhe des Kuchens
    nDeep = 10
    
    'Koordinaten errechnen
    nWidth = oPicBox.ScaleHeight + Int(oPicBox.ScaleHeight / 2) - 20
    nHeight = oPicBox.ScaleHeight - 20
    nLeft = (oPicBox.ScaleWidth / 2) - (nWidth / 2)
    nTop = (oPicBox.ScaleHeight / 2) - (nHeight / 2)
    
    'Winkel im Gradmaß errechnen
    nWinkel = (dblValue / dblMax) * 360
    nGrad = Int(nWinkel - 270)
    
    'Koordinaten
    dblX1 = nWidth * Sin(((nGrad * PI) / 180))
    dblY1 = nHeight * Cos(((nGrad * PI) / 180))

    If nWinkel = 360 Then
        'Die unteren Scheiben (für den 3D-Effekt)
        For i = nDeep To 1 Step -1
            If i < nDeep Then .ForeColor = DarkBlue
            .FillColor = DarkBlue
            
            Pie .hdc, nLeft, nTop + i, nLeft + nWidth, nTop + nHeight + i, nLeft, _
                nTop + (nHeight / 2) + i, nLeft, nTop + (nHeight / 2) + i
        Next i
        
        'Die oberste Scheibe
        .ForeColor = vbBlack
        .FillColor = vbBlue
        Pie .hdc, nLeft, nTop, nLeft + nWidth, nTop + nHeight, nLeft, _
            nTop + (nHeight / 2), nLeft, nTop + (nHeight / 2)
    Else
        'Die unteren Scheiben (für den 3D-Effekt)
        For i = nDeep To 1 Step -1
            If i < nDeep Then .ForeColor = DarkMagenta
            .FillColor = DarkMagenta
            Pie .hdc, nLeft, nTop + i, nLeft + nWidth, nTop + nHeight + i, nLeft, _
            nTop + (nHeight / 2) + i, nLeft, nTop + (nHeight / 2) + i
            
            If i < nDeep Then .ForeColor = DarkBlue
            .FillColor = DarkBlue
            Pie .hdc, nLeft, nTop + i, nLeft + nWidth, nTop + nHeight + i, nLeft, _
                nTop + (nHeight / 2) + i, nLeft + (nWidth / 2) - Round(dblX1), _
                nTop + (nHeight / 2) - Round(dblY1) + i
        Next i
        
        'Die oberste Scheibe
        .ForeColor = vbBlack
        .FillColor = vbMagenta
        Pie .hdc, nLeft, nTop, nLeft + nWidth, nTop + nHeight, nLeft, _
            nTop + (nHeight / 2), nLeft, nTop + (nHeight / 2)

        .FillColor = vbBlue
        Pie .hdc, nLeft, nTop, nLeft + nWidth, nTop + nHeight, nLeft, _
            nTop + (nHeight / 2), nLeft + (nWidth / 2) - Round(dblX1), _
            nTop + (nHeight / 2) - Round(dblY1)
    End If
    End With
End Sub

Private Sub Form_Load()
    PaintPie Picture1, 33, 100
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Projekt1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 2 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Philipp Stephani am 13.11.2003 um 19:54

Ich wollt nur darauf hinweisen, dass es dafür auch eine Klasse in der Klassenrubrik gibt.

Kommentar von Ralf Faude am 30.12.2002 um 10:29

Was noch fehlt ist die Beschriftung der Kuchstücke mit Prozentzahl.