Mehrere Kreisflächen erstellen, klickbar, zoombar usw.

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von siola52.

    Mehrere Kreisflächen erstellen, klickbar, zoombar usw.

    Servus,

    programmiere schon seit Jahren mit Access und bin jetzt auf VB2010 Express umgestiegen. Als VB und Foren Neuling hab ich folgende Frage:

    Ich möchte eine Kreisfläche, vergleichbar wie ein runder Bierdeckel, mit mehreren Segmenten erstellen.
    Die Segmente sollen nicht nur Kuchenstücke werden sondern den Durchmesser vom Kreis unterteilen.
    Teilerfolg hab ich mit DrawPie/FillPie bereits aber ich bin mir nicht sicher ob ich da auf dem richtigen Weg bin.

    Die Elemente soll man mit der Maus anklicken können und die Füllfarbe soll sich dann ändern, auch sollte es Zoombar werden um später einzelne Elemente besser auswählen zu können. Auch möchte ich die veränderten Elemente später auslesen können, es geht dabei um den Wert 1 oder 0.

    Ansätze dazu würden mir schon mal reichen.
    Danke für Eure Hilfe
    Gruß
    Alois
    Willkommen im Forum. :thumbup:
    Wenn Du einen Kreis so unterteilst, nennt man die Dinger "Speichen und Radien".
    Tortenstücks (Pie) heißen die Elementar-Dinger, wo ein Kreis mehrere Speichen aber nur einen Radius hat.
    Ein vollständiges Pie kannst Du per Graphics.DrawPie(...) oder Graphics.FillPie(...) erstellen.
    Sieh Dir die Parameter genau an, insbesondere die Winkel.

    VB.NET-Quellcode

    1. Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    2. e.Graphics.DrawPie(Pens.Blue, New Rectangle(100, 100, 500, 500), 210, 30)
    3. e.Graphics.FillPie(Brushes.Yellow, New Rectangle(200, 200, 300, 300), 210, 30)
    4. End Sub
    Das Anfassen und Ziehen bekommen wir später. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke Rod für die schnelle Antwort.

    So weit bin ich bereits, also bin ich schon auf dem richtigen Weg denke ich.
    Mir ist nun der Klick nicht klar wie ich den mache das sich das richtige Feld dahinter ändert.

    Hier mein vorläufiges Ergebnis:
    (Ich hoffe das mit dem Einfügen klappt)

    Gruß
    Alois

    siola52 schrieb:

    Ansätze dazu würden mir schon mal reichen.
    Na, da simmermal gespannt, ob Ansätze reichen.

    also das kann man imo nur mit richtig objektorientierte Programmierung lösen, also du mußt eine Klasse erstellen, die weiß, wie sie sich selbst zeichnen soll.
    Denkbar wäre iwas, wo man Koordinaten angibt, und dann weiß das Ding, welches Zielscheibensegment (oder wie man das Dings nennen soll) gemeint ist, und malt sich da rein.
    Weitere Features kann man dann da anbauen, etwa Farbwechsel oder iwelche TextAnzeigen etc.
    Beim Zoomen mußt du noch genauer definieren: Soll ein vergrößerter Ausschnitt der Zielscheibe gezeigt wern, oder soll sich nur das angewählte Segment vergrößern?

    So, Ansätze: Figuren kannst du im GraphicsPath anlegen, und mit der Matrix-Klasse kannst du diese Figuren verschieben, drehen, vergrößern - halt alles, was man so braucht. Gugge Control mit beweglicher Figur

    Da du aus der Datenbänkerei kommst, könnte Outlined und ziehbare Schrift viel interessanter sein - das sind nämlich Datensätze, die sich zu zeichnen wissen.

    Auch hübsch ist StoryCards - dassis auch noch vergleichsweise einfach.
    Danke ErfinderDR,

    das sind doch schon mal Ansätze für mich, es zeigt mir das ich gar nicht so falsch liege und es viel Aufwand und Kenntnisse bedeutet.

    Ich hoffte das es eine einfachere Methode gibt es zu realisieren (z.B. eine Funktion die das kann).

    Zum Zoom ist zu sagen, dass es in Wirklichkeit viel mehr und deswegen viel kleinere Elemente sind, aber das Bild nicht größer.
    Auch werden die Anzahl der Elemente variabel.

    Es sind auch noch weitere Möglichkeiten der Bearbeitung geplant aber erstmal bin ich schon froh wenn ich das gelöst bekomme, also Schritt für Schritt.

    Gruß
    Alois
    Du musst die Darstellung parametrisieren.
    Klar ist, dass Du jedes Pie mit mehreren Radien von außen nach innen aufbauen musst. Wenn Du also bei 4 Radien das äußerste Segment in der Farbe ändern willst, musst Du dieses und alle inneren neu zeichnen. D.h., es gibt eine Eltern-Kind-Struktur, die Du mit implementieren musst: Ein "Elter" sagt seinen Kindern, dass sie sich neu malen müssen.
    Wenn Du die Größe verändern willst, löse das in 2 Schritten.
    1. ändere die Größe Deiner Zielscheibe über Button-Klicks
    2. mach Dich in einem separaten Projekt mit MouseDown, MouseMove und MouseUp vertraut.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Servus Rod..,

    das freut mich zu lesen denn so weit war ich bereits war mir nur nicht sicher das es richtig ist.
    Das Problem ist das ich bei ca 4000 Elementen der Aufbau relativ langsam ist, aber das ist noch nicht das aktuelle Problem.

    Was ich mir nicht ganz vorstellen kann ist wie ich jetzt ein Element auswähle, die Mausabfrage mit den Koordinaten hab ich schon.
    Die aktuelle Farbe fehlt mir auch noch, ich bekomme immer nur die Farbe von der PictureBox.

    Kann ich diese Lösungen irgendwo nachlesen, gutes Buch oder Web-Site.
    Die Grundlagen von GallileoPress hab ich bereits und das Buch hat auch geholfen.
    Vielleicht gibt es auch hier jemanden der mir in dieser Programmierung mithelfen möchte/kann.

    Aber mit Euren Antworten komm ich bereits weiter, zumindes ist mein Lösungsansatz richtig.
    Also schon mal Herzlichen Dank dafür, wenn wir so weiter machen bekomme ich es auch noch hin. :thumbsup:

    Gruß
    Alois
    Für die Farb-Auswahl gibt es einen ColorDialog (ähnlich dem OpenFileDialog).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke Rod...,

    jetzt haben wir und falsch verstanden, ich möchte nicht die Farbe wählen können sondern die Farbe des Segments bestimmen und ändern (2 Zustände).

    Besser erklärt was ich vorhabe:
    Die Grundfarbe jeden Elementes ist erstmal weiß und entspricht einer "0", ein Klick auf ein Segment ändert die Farbe nach blau entspricht einer "1" und natürlich umgekehrt.

    Wenn alles vom Benutzer eingestellt ist möchte ich dann nach einer bestimmten Reihenfolge alle Segmente abfragen, dessen Zustand (0=weiß oder 1=blau) auslesen und in ein Datenbank-Tabelle speichern.

    Mit der Weiterverarbeitung der Daten und mit Steuerelementen usw. hab ich ja kein Problem aber die Grafikprogrammierung hab ich noch nie gemacht.

    Gruß
    Alois
    Oha.
    Ich nehme mal an, dass die Farbe in den Properties der Tortenstücke hinterlegt ist.
    Also ist das momentane Problem: Wie komme ich von den MouseKlick-Koordinaten an das Tortenstück?
    Da musste ein wenig Geometrie programmieren, Kreismittelpunkt -> KlickPunkt, Radius, Winkel jeweils von Start bis Ende, wenn Du das Tortenstück identifiziert hast, liest Du einfach seine Property aus.
    Fertich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Jetzt hast du mich erwischt :rolleyes:

    Genau da hab ich auch das Problem meiner Kenntnisse.
    Wenn ich z.B. die PictureBox plaziere weis ich wie ich darauf zugreifen kann aber wie geht das mit den automatisch erstellten Elementen, die haben ja keinen Namen oder doch?
    Oder wie muss ich mir das vorstellen?
    Die Koordinaten des Mittelpunktes solltest Du kennen.
    Die Klick-Loordinaten hast Du.
    Pytagoras -> Abstand Mittelounkt - Klickpunkt ==> Zone der Zielscheibe.

    VB.NET-Quellcode

    1. Math.Atan2(yk - ym, xk - xm)
    ==> Winkel und damit Sektor der Zielscheibe (Bogenmaß)
    xk, yk - Klickkoordinaten (Pixel)
    xm, ym - Mittelpunkt (Pixel)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das ist mir so weit jetzt klar

    Aber wie komme ich auf die Property des Elementes, da fehlt mir jetzt der Zusammenhang etwas.
    Welche Funktion setze ich da dann ein wenn ich die Koordinaten habe?

    Anscheinend hab ich da grad eine Denkblokade.
    Da musst Du so rangehen, wie Du Deine Scheiben malst.
    Wenn Du einen Winkel hast, musst Du wissen, dass dieser Winkel zu Pie-Gruppe 17 gehört.
    Wenn Du den Radius hast, musst Du wissen, dass dieser Radius zu Zone 13 gehört.
    Also Pie-Gruppe 17 und Zone 13 oder wie Du Deine Elemente halt angeordnet hast.
    Überleg Dir gleich eine Randbehandlung dazu, wenn also auf eine Linie geklickt wird.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich hab so etwas schon befürchtet :S

    Also muss ich alle Werte der einzelnen Elemente wegspeichern um danach zur Auswertung der Koordinaten verwenden zu können.
    Dann ist mir jetzt auch so weit klar wie ich am Ende an meine Daten zum Speichern komme.

    Ich hoffte das VB da was automatisch macht :rolleyes:

    Dann hab ich ja schon mal einiges an Arbeit vor mir

    Ich denke um die Bildlaufleisten beim Zoomen muss ich mich dann auch per Code kümmern oder?

    siola52 schrieb:

    Also muss ich alle Werte der einzelnen Elemente wegspeichern
    Nur die Eckdaten, also Winkel und Radien.
    Zum Zoomen sieh Dir mal GraphicsPath an.
    Das Anfassen und Ziehen ist hier die meiste Arbeit.
    Die Scrollbars erscheinen automatisch, wenn das gezeichnete Bild größer als die Darstellfläche ist (kann sein, dass Du dazu ein spezielles PictureBox in Panel-Contrrol brauchst).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Super!
    Der Zoom funzt jetzt, musste ein Panel dazwischen verwenden und natürlich die Große der PictureBox autom. je nach Zoomfaktor anpassen lassen.
    Die Eckdaten für die einzelnen Pie sind mir klar, hab nur noch nicht die Lösung wie ich es machen werde aber das kommt noch.

    Jetzt wenn ich die Pie zeichnen lasse und um so mehr ich einstelle umso langsamer wird der Bildaufbau.
    Ich hab da was über doublebuffered gelesen und auch schon rumprobiert, aber es wird nicht schneller, ist das die Lösung dazu?
    Was mache ich falsch?

    siola52 schrieb:

    um so mehr ich einstelle umso langsamer wird der Bildaufbau.
    Wieviele hast Du denn?
    Poste vllt. mal Deinen Code.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dann sollten wir die nicht im Paint-Event malen, sondern eine Bitmap vorrätig halten.
    Die kannst Du (praktisch) genau so bemalen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!