Kreisdiagramm Problem

  • VB6

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Alex2000.

    Kreisdiagramm Problem

    Ich möchte ein Kreisdiagram erstellen. Ich habe den Operator Circle benutzt. Doch am Ende ist einfach ein Kreis rausgekommen. Ist auch logisch: Circle zeichnet eine Kreis oder ein Teil des Kreisbogens, Doch die Linien, die von den zwei Enden des Kreisbogens in seine Mitte gehen, zeichnet er nicht.
    Wie kann ich jetzt diese Linien zeichnen? Vieleicht gibt es einen Operator, der den Punkt wiedergibt, auf dem sich der "Stift" des Rechners beim Zeichnen gerade ist?
    Hi,
    Schau dir ma gdi graphicspath an. Da gibs addArc (Kreisbogen) und dann brauste nur die beiden Linien hintendrann"Adden". Der Graphicspath verbindet die Elemente einer Figur übrigens auch automatisch.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Hallo alexnikolsky,
    die Winkelangaben müssen negativ sein. Probier' mal dieses:

    Visual Basic-Quellcode

    1. Private Sub Form_Load()
    2. Dim i%, Wnk1!, Wnk2!
    3. Me.ScaleMode = vbPixels
    4. Me.AutoRedraw = True
    5. Me.FillStyle = vbFSSolid
    6. For i = 1 To 3
    7. Wnk1 = Choose(i, 0.1, 2.4, 3.9)
    8. Wnk2 = Choose(i, 2.4, 3.9, 0.1)
    9. If Wnk1 = 0 Then Wnk1 = 0.001
    10. If Wnk2 = 0 Then Wnk2 = 0.001
    11. Me.FillColor = Choose(i, vbYellow, vbCyan, vbMagenta)
    12. Me.Circle (Me.ScaleWidth / 2, Me.ScaleHeight / 2), 170, vbBlack, -Wnk1, -Wnk2
    13. Next i
    14. End Sub


    @Vatter: Die Frage bezog sich auf VB6.
    Gruss,

    Neptun
    Ich hab noch eine Möglichkeit gefunden (glaube ich), aber da kommt wieder ein Problemm

    Dim sum As Double, perc(2) As Double, nr(2) As Double, i As Byte, a As Single, b As Byte
    Private Sub Command1_Click()
    nr(0) = Text1.Text
    nr(1) = Text2.Text
    nr(2) = Text3.Text

    sum = nr(0) + nr(1) + nr(2)
    For i = 0 To 2
    perc(i) = Round(nr(i) / (sum / 100))
    Next
    Picture1.Scale (-50, 50)-(50, -50)

    Picture1.FillStyle = 2

    Picture1.ForeColor = vbBlack
    Picture1.Circle (0, 0), 20, vbBlack, a, a + Round((3.141592654 / 180) * (360 / 100) * perc(0))
    a = a + Round((3.141592654 / 180) * (360 / 100) * perc(0))

    Picture1.FillColor = vbWhite
    Picture1.Circle (0, 0), 20, vbWhite, a, a + Round((3.141592654 / 180) * (360 / 100) * perc(1))
    a = a + Round((3.141592654 / 180) * (360 / 100) * perc(1))

    Picture1.FillColor = vbYellow
    Picture1.Circle (0, 0), 20, vbYellow, a, a + Round((3.141592654 / 180) * (360 / 100) * perc(2))
    a = a + Round((3.141592654 / 180) * (360 / 100) * perc(2))

    'Next

    End Sub

    Meine Idee war, dass der Computer, wenn er einen Teil des Kreisdiagrammes zeichnet, ihn dann färbt. Doch er färbt nur die Linien, und ´das Innere des Diagramms nicht... :cursing:
    Hi,
    Probiers mal mit der Klasse:

    Visual Basic-Quellcode

    1. Imports System.Drawing
    2. Imports System.Drawing.Drawing2D
    3. Public Class Kreisdiagramm
    4. Public Paths As New List(Of Arc)
    5. Dim g As Graphics = Nothing
    6. Private loaded As Boolean = False
    7. Private IMG As Image
    8. Private Color As Color = Color.Transparent
    9. Public Event ImageChanged(ByVal img As Image)
    10. Public Property BackColor() As Color
    11. Get
    12. Return Color
    13. End Get
    14. Set(ByVal value As Color)
    15. Color = value
    16. End Set
    17. End Property
    18. Public Sub New(ByVal Width As Integer, ByVal Height As Integer)
    19. IMG = CType(New Bitmap(Width, Height), Image)
    20. g = Graphics.FromImage(Me.IMG)
    21. Draw()
    22. End Sub
    23. Public Structure Arc
    24. Dim startangle As Integer
    25. Dim sweepangle As Integer
    26. Dim Brush As Brush
    27. Dim Rect As Rectangle
    28. End Structure
    29. Public Sub AddPath(ByVal Brushes As Brush, ByVal startangle As Integer, ByVal sweepangle As Integer)
    30. Dim x As New Arc
    31. x.Brush = Brushes
    32. x.Rect = New Rectangle(1, 1, IMG.Width, IMG.Height)
    33. x.startangle = startangle
    34. x.sweepangle = sweepangle
    35. Paths.Add(x)
    36. Draw()
    37. End Sub
    38. Public Sub Refresh()
    39. Draw()
    40. End Sub
    41. Private Sub Draw()
    42. If Not Paths.Count = 0 Then
    43. g.Clear(Me.BackColor)
    44. For Each Paths As Arc In Me.Paths
    45. g.FillPie(Paths.Brush, Paths.Rect, Paths.startangle, Paths.sweepangle)
    46. Next
    47. RaiseEvent ImageChanged(IMG)
    48. End If
    49. End Sub
    50. End Class

    Verwendung ca. so:

    Visual Basic-Quellcode

    1. Public Class Form1
    2. Dim WithEvents Kreis As New Kreisdiagramm(100, 100)
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Dim x As New ColorDialog
    5. If x.ShowDialog = Windows.Forms.DialogResult.OK Then
    6. Button1.BackColor = x.Color
    7. End If
    8. End Sub
    9. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    10. Kreis.AddPath(New SolidBrush(Button1.BackColor), CInt(TextBox1.Text), CInt(TextBox2.Text))
    11. End Sub
    12. Private Sub ImageChanged(ByVal img As Image) Handles Kreis.ImageChanged
    13. PictureBox1.Image = img
    14. End Sub
    15. End Class

    Da hab ich folgende Controls verwendet: 1Picturebox(Picturebox1), 2 Buttons(Button1, Button2), 2 Textboxen(Textbox1, Textbox2)
    Textbox1 ist für startangle und Textbox2 für Sweepangle.


    Startangle = Wo fängt der Kreis an (in °).
    Sweepangle = Wieviel ° geht er weiter.

    Hoffe konnte dir helfen!
    Mfg
    Loadsoft