Werte in Diagram zeichnen oder zeigen lassen
-
Hallo ,
Ich habe in mein Contanier verschiedene Werte, und ich möchte die werte Graphisch darstellen oder in eine Graphische Diagramm zeigen oder auf eine Torte die prozentualle werte zeigen.
Kann mir jemand sagen wie ich damit anfangen soll. Welche bibliotheke oder welche klassen muss ich benutzen.
Vielen vielen Dank
-
mit torte meine ich Kreis Diagramm
-
Schon mal bei CodeProject nachgesehen?
http://www.codeproject.com/KB/miscctrl/index.aspx?#Miscellaneous Controls - Charting Controls
-
JA , aber die find ich bisschen kompliziert und zwar ich habe in MFC also in meinem Programm paar werte und will die werte auf ein Kreis diagramm darstellen.
zum Beispiel ein tag hat 24 Stunden und 6 stunden habe ich an diesem Tag geschlafen und diese 6 stunden wurden in m_vSchlaf vektor gespeichert und 18 stunden war ich wach, die 18 stunden wurden dann in m_vWach vektor gespeichert.
Ich will die werte in ein Kreis diagram mit verschiedene Farben zeigen. Also 6 Studen und 18 stunden möchte ich auf dem Kreis teilen.Wie kann man dieses Problem am besten lösen?
Mit CDC? ich würd mich freuen wenn Sie mir helfen könnten
Vielen Dank
-
Hallo,
ich hab mich damit auch mal schwer getan.
Ich würde an deiner Stelle auch die CDC-Klasse nutzen. Mit CDC::Elipse und MoveTo/LineTo kannst du schonmal die "Torte" zeichnen (Umrechnen der Arbeitsanteile in Winkel usw.).
Das Füllen der Flächen kannst du wohl mit FloodFill machen.Ich zeichne das ganze in einem Bitmap welches ich dann einem PictureControl anhänge (sieht mit dem Rahmen ganz gut aus...)
Grüße
Micha
-
Könntest du mir die nötige teil von deinem Code hier schreiben wenn es geht
Vielen Dank
-
Nachfolgender Code Zeichnet die Torte und teilt die Schlafzeit ab. Grundfarbe ist Grün. Die Wachzeit wird dann rot eingefärbt. Um M_PI zu nutzen #define _USE_MATH_DEFINES setzen.
Um sin() und cos() zu nutzen musst du math.h includen (nach #define _USE_MATH_DEFINES).
Ich habs in der OnDraw(CDC* pDC) einer CView gezeichnetCRect rect(10,10,300,300); //Zeichenfläche CPoint center(static_cast<int>((rect.right-rect.left)/2+rect.left), static_cast<int>((rect.bottom-rect.top)/2+rect.top)); int radius = (rect.right-rect.left)/2; int tSchlaf = 6, tWach = 18; int tGes = tSchlaf + tWach; COLORREF r = RGB(255,0,0), g = RGB(0,255,0), b = RGB(0,0,255), sw= RGB(0,0,0); CBrush RedBrush(r); CBrush BlueBrush(b); CBrush GreenBrush(g); //CPen FatPen(PS_SOLID, 3, sw); //pDC->SelectObject(&FatPen); //Hintergrund //pDC->FillSolidRect(rect, b); //Kreis zeichnen pDC->SelectObject(&GreenBrush); pDC->Ellipse(rect); //erster Teilstrich von Mitte nach oben pDC->MoveTo(center); pDC->LineTo(center.x, center.y-radius); //Schlafzeit einzeichnen double winkel = tSchlaf*(2*M_PI/tGes); //#define _USE_MATH_DEFINES pDC->MoveTo(center); pDC->LineTo(center.x + sin(winkel)*radius, center.y - cos(winkel)*radius); //#include "math.h" //Fläche einfärben pDC->SelectObject(&RedBrush); pDC->ExtFloodFill(100 , 100, g,FLOODFILLSURFACE); //pDC->SetPixel(100,100,RGB(0,255,0));
Das Mit dem Zeichnen im Bitmap und einem CStatic anhängen mache ich so (z.B. für Darstellung auf einer Dialogoberfläche):
CRect rect; //m_FrameApprox ist CStatic member (Picturecontrol typ: Bitmap) m_FrameApprox.GetClientRect(&rect); CDC memDC; CClientDC dc(this); memDC.CreateCompatibleDC(&dc); // //m_bmApproxGraph typ: CBitmap if(m_bmApproxGraph.m_hObject == NULL) { m_bmApproxGraph.CreateCompatibleBitmap( &dc, rect.Width(), rect.Height()); } memDC.SelectObject(&m_bmApproxGraph); memDC.FillSolidRect(&rect, RGB(255,255,255)); //Hintergrund weissen memDC.SetBkMode(TRANSPARENT); //paint with memDC here... //finish with painting CBitmap an CStatic anhängen m_FrameApprox.SetBitmap(m_bmApproxGraph); m_FrameApprox.InvalidateRect(&rect,TRUE) ; //neuzeichnen
edit: Vorzeichenfehler behoben und Winkel in Bogenmaß!
Grüße
Micha
-
Vielen Vielen vielen Dank
-
Nochmals Vielen Dank für den Code,
Ich habe in eine CView die erste Code in OnDraw() funktion benutzt, man sieht schon eine Torte mit der Farben(grün und rot) aber wenn man die Werte ändert , dann funktioniert es nicht richtig , z.B. Wenn ich die beide Werte 18 mache dann muss ich rot und grün beide halbiert sehen , so muss kreis halbiert werden mit rote und grüne fläche. Oder wenn ich die werte als tSchlaf =3 und tWach=21 eingebe, dann sieht die Torte wieder komisch aus.Damit es Richtig funktionieren kann muss ich die zweite Code(Zeichnen im Bitmap und einem CStatic anhängen ) auch benutzen oder das ist ne andere Fehler?
Außerdem hätte noch ne frage , wo werde ich genau diese zweite Code( Zeichnen im Bitmap und einem CStatic anhängen) benutzen also in welche funktion? wieder in CView oder in eine andere klasse soll ich ne neue Funktion definieren und den Code reinschreiben.
Vielen Dank für deine Hilfe
Gruß
-
ich hoff dass du mein beitrag gelesen hast
-
Der zweite Codeteil ist dafür gedacht, wenn du das ganze auf einer Dialogoberfläche darstellen willst. Kannst du weglassen...
zwei Fehler hab ich bei mir gefunden:
Ein Vorzeichenfehler vor cos() und der Winkel für cos() und sin() darf nicht in Grad, sondern in Bogenmaß angegeben werden. Die Definition für Pi (M_PI) findest du auch in math.h (vor #include math.h noch #define _USE_MATH_DEFINES setzen)
Ich habs mit der Kontrolle nicht so genau genommen. bei ExtFloodFill musst du noch die x und y Werte berechnen. Ich hab sie nur Hardgecodet weil es erstmal einfacher ist. für winkel gegen 2 Pi funktioniert das einfärben dann nicht mehr. Das ist aber nur ein bischen mathe. Das ist deine Aufgabe...