Grafische Ausgabe nicht so wie sie sein soll. keine Horizontale Ausdehnung der Linien.



  • case WM_PAINT:{
    					timer_counter = GetWindowLong(hWnd,TIMER_COUNTER);
    					count_new = GetWindowLong(hWnd,PAINT_COUNTER);
    					count_new++;
    					SetWindowLong(hWnd,PAINT_COUNTER,count_new);
    
    					hDC = BeginPaint( hWnd, &ps );
    
    					file = fopen("datafile.dat","r");
    					if( file == NULL){
    						//info
    						TextOut( hDC, 10, 10, "Datei konnte nicht geöffnet werden!", 35 );
    						return -1;
    					}
    
    					if(i<=20){
    					}
    						else{
    						for( i=0; i<HISTORY; i++)
    							buffer[i]=0;
    
    					}
    
    					nTail=0;
    
    					// Rücksetzen der Extremwertspeicher
    					nMin= 99;
    					nMax=0;
    
    					// Daten lesen
    					// seek 0
    					fseek(file, 0, SEEK_SET);
    					// read string
    					fgets( puffer, sizeof(puffer), file );
    					// zu Integer konvertieren
    					nValue=atoi(puffer);
    
    					// min und max merken
    					if(nValue > nMax)
    						nMax=nValue;
    
    					if(nValue < nMin)
    						nMin=nValue;	
    
    					// am En de in den Ringpuffer einfügen
    					buffer[nTail]=nValue;
    					// ... und zur nächsten Position mit "Überschlag"
    					nTail= (nTail +1) %HISTORY;
    
    					// vom Ende beginnend ausgeben
    					nDrawPos=nTail;
    
    					//startkoordinate setzen
    					//	MoveToEx(hDC,koordinate_x+(i*SCHRITTWEITE),buffer[nDrawPos],NULL);
    
    					for(i=0; i<HISTORY; i++)
    					{
    						// Im Moment klappt das mit dem weiterrücken nicht								
    						MoveToEx(hDC,koordinate_x,buffer[nDrawPos],NULL);
    
    						koordinate_x=+10;
    
    						LineTo(hDC,koordinate_x*i,buffer[nDrawPos]);
    
    						nDrawPos= (nDrawPos +1) % HISTORY;
    					}
    
    					// 1/2 Sec. warten
    					Sleep(500);
    
    					InvalidateRect(hWnd,0,FALSE);
    
    					EndPaint( hWnd, &ps );
    
    					close(file);
    
    					break;
    					}
    

    Vielleicht habe ich auch was bei MoveToEx nicht richtig verstanden. Der Befehl ist doch zu Positionierung oder? In der Schleife mit dem MoveToEx und dem LineTo soll ein "Graph" gezeichnet werden. Pro schritt soll der abschnitt 10 pixel breit sein. Aber bei mir bewegt sich die Linie nur in vertikaler Richtung egal was ich an der X Koordinate ändere und ich raff nicht wieso.

    Anfangsposition setzen, Linie zeichnen, neue Anfangsposition == Ende der Linie oder nicht?

    Wenn einer weiß warum ich wo gegen den Baum laufe, dann bitte mal die Axt rausholen und den Baum fällen. Damit mein Brett vor dem Kopf verschwindet.

    Gruß
    Snoop


  • Mod

    Nur mal am Rande:
    1. Was soll der Sleep in WM_PAINT?
    2. Was soll der Invalidate in WM_PAINT vor EndPaint?

    Was soll das Ding den tun?



  • Ich habe eine Datei datafile.dat aus der werte ausgelesen werden. Diese sollten dann als Graph dargestellt werden. Bedingung hierbei ist das jeder wert als linie der länge 10 pixel mit der höhe(dem wert) als y-komponente dargestellt werden soll. Hierbei soll auch noch das MoveToEx zum einsatz kommen, aber ich krieg es einfach nicht hin das er den ersten strich zeichnet und dann DAHINTER den 2ten, obwohl das ganze ja nur eine verschiebung in x richtung ist, macht er es nicht wenn ich ihm sage MoveToEx ende der Linie und das ist der neue anfang für den nächsten Wert der als Linie dargestellt wird.

    Das Sleep soll nur als verzögerung drinnen sein, weil die werte mit 1/2 sec in der Datei ankommen.

    Mit dem InvalidateRect wird doch nur das Fenster aktualisiert oder und zwar in dem Fall das gesamte Fenster?

    gruß
    Snoop



  • Du solltest das lesen der Datei *nicht* in WM_PAINT machen! Sondern am besten in einem WM_TIMER, welcher z.B. alle 500 ms aufgerufen wird.
    Nach dem einlesen und den speichern in einer "Variablen", solltest Du InvalidateRect aufrufen, welches dann (wenn das Fenster sichtbar ist) ein WM_PAINT auslöst. Dann kannst Du dort Zeichnen (und bitte *nur* Zeichnen!).



  • Danke für den Tip mit der Aufgabenteilung.

    Wenn ich mich nun mal auf das Zeichnen im WM_PAINT beschränke kommen wir schon zum Kernproblem.

    for(i=0; i<HISTORY; i++)
                        {
                            // Im Moment klappt das mit dem weiterrücken nicht                               
                            MoveToEx(hDC,koordinate_x,buffer[nDrawPos],NULL);
    
                            koordinate_x=+10;
    
                            LineTo(hDC,koordinate_x*i,buffer[nDrawPos]);
    
                            nDrawPos= (nDrawPos +1) % HISTORY;
                        }
    

    koordinate_x hat einen startwert und der wird danach erhöht, beim nächsten durchlauf sollte doch die koordinate die ja um 10 erhöht worden ist auch weiter rechts landen, da es ja die x koordinate ist oder?



  • Mach aus
    koordinate_x**=+10;
    das hier:
    koordinate_x
    +=**10;

    Vermutlich war das nur ein Tippfehler von dir, oder?
    Mit =+10 setzt du jedes Mal koordinate_x auf +10.

    for(i=0; i<HISTORY; i++)
                        {
                            // Im Moment klappt das mit dem weiterrücken nicht                              
                            MoveToEx(hDC,koordinate_x,buffer[nDrawPos],NULL);
    
                            koordinate_x+=10;    // Hier geändert
    
                            LineTo(hDC,koordinate_x*i,buffer[nDrawPos]);
    
                            nDrawPos= (nDrawPos +1) % HISTORY;
                        }
    


  • selbst wenn ich

    koordinate_x=koordinate_x+10;
    

    schreibe gehts kein pixel weiter, obwohl der wert ja eindeutig sich erhöht.

    Gibt bei LineTo evtl richtungstechnisch was zu beachten?


Anmelden zum Antworten