Wiederholtes Zeichnen



  • Hallo
    Ich bin recht neu in C++ und noch neuer in der WinAPI und habe bis jetzt nur mit Online Tutorials gearbeitet(Buch kommt bald). Es kann daher gut sein das meine Frage in euren Ohren ziemlich bescheuert kling.

    So zu meiner Frage:

    Ich habe ein kleines Programm geschrieben, dass Räuber-Beute-Beziehungen berechnet und diese dann in einem Koordinatensystem graphisch darstellt.
    Man gibt die Werte ein, klickt auf "Berechnen" und er zeigt das Schaubild an.

    Hier gibts ein Bild

    Soweit so gut.
    Doch das Problem ist, dass wen ich das zweite mal auf "Berechnen" drücke, dass dann nichts passiert nichts.
    Am liebsten währe mir, dass mein Programm wen man dass zweite mal drückt die ersten beiden Linien löscht und die neuen Zeichnet.

    Hier mal mein WM_PAINT:

    case WM_PAINT:
        {
    
    		 PAINTSTRUCT    ps;
    		 HDC            hDC;
    
             hDC = BeginPaint(hWnd, &ps);
    		 if(zeichne == true)
    		 {
    
    			 static POINT    point1;
    		     static POINT    point2;
    		     double bes1;
    		     double bes2;
    		     double zu1;
    		     double zu2;
    		     double ab1;
    		     double ab2;
    		     double besneu1;
    		     double besneu2;
    		     double strecken1;
    		     double strecken2;
    		     char edit[10];
    		     char edit2[10];
    		     char edit3[10];
    		     char edit4[10];
    		     char edit5[10];
    		     char edit6[10];
    		     char editstrecken1[10];
    		     char editstrecken2[10];
    
    			GetWindowText(hEdit, edit, 10);
    			GetWindowText(hEdit2, edit2, 10);
    			GetWindowText(hEdit3, edit3, 10);
    			GetWindowText(hEdit4, edit4, 10);
    			GetWindowText(hEdit5, edit5, 10);
    			GetWindowText(hEdit6, edit6, 10);
    			GetWindowText(hstrecken1, editstrecken1, 10);
    			GetWindowText(hstrecken2, editstrecken2, 10);
    
    			bes1 = atof (edit);
    			zu1 = atof (edit2);
    			ab1 = atof (edit3);
    			bes2 = atof (edit4);
    			zu2 = atof (edit5);
    			ab2 = atof (edit6);
    			strecken1 = atof (editstrecken1);
    			strecken2 = atof (editstrecken2);
    			if(strecken1 == 0);
    			{
    				strecken1 = 1;
    			}
    			if(strecken2 == 0)
    			{
    				strecken2 = 1;
    			}	
    			while(zaehlen<51)
    			{
    				besneu1 = bes1 + (zu1 * bes1 - ab1 * bes1 * bes2);
    				besneu2 = bes2 + (zu2 * bes2 * bes1 - ab2 * bes2);
    
    				HPEN hOldPen = (HPEN)SelectObject(hDC, 
    										 CreatePen(PS_SOLID, 3, RGB(227, 29, 41)));
    				if(zaehlen == 1)
    				{
    				    MoveToEx(hDC, 30, 570 - bes1*strecken1*1.6, NULL);
    				}
    				else
    				{
    					MoveToEx(hDC, point1.x, point1.y, NULL);
    				}
    				LineTo(hDC, 30+zaehlen*15, 570-besneu1*strecken1*1.6);
    			    point1.x = 30+zaehlen*15;
    				point1.y = 570-besneu1*strecken1*1.6;
    				DeleteObject(SelectObject(hDC, hOldPen));
    
    				HPEN hOldPen2 = (HPEN)SelectObject(hDC, 
    										 CreatePen(PS_SOLID, 3, RGB(0, 255, 0)));
    				if(zaehlen == 1)
    				{
    				    MoveToEx(hDC, 30, 570 - bes2*strecken2*1.6, NULL);
    				}
    				else
    				{
    					MoveToEx(hDC, point2.x, point2.y, NULL);
    				}
    				LineTo(hDC, 30+zaehlen*15, 570-besneu2*strecken2*1.6);
    	            point2.x = 30+zaehlen*15;
    				point2.y = 570-besneu2*strecken2*1.6;
    				DeleteObject(SelectObject(hDC, hOldPen2));
    
    				bes1 = besneu1;
    				bes2 = besneu2;
    				zaehlen += 1;
    			}
    
    			EndPaint(hWnd, &ps);
    			zeichne = false;
    			return 0;
    			}
    
    		}
    

    zeichne wird true wenn der Button gedrückt wird
    (Das zeichnen des Koordinatensystemes habe ich mal drausen gelassen)

    Ich bedanke mich schonmal im voraus.

    MFG Tim



  • case button_malen_gedrückt:
    {
       RECT rec;
       DeleteDC(hDC); - dc löschen
       GetClientRect(hWnd, &rec); - fenster infos in rc speichern
       InvalidateRect(hWnd, &rec, true); -  fenster neu malen
    
    }break;
    


  • Also es wird jetzt zwar gelöscht aber danach zeichnet sich nur das Koordinatensystem das ich auch in WM_PAINT zeichne neu gezeichnet, aber die Linien nicht.

    case WM_PAINT:
        {
    
             PAINTSTRUCT    ps;
             HDC            hDC;
    
             hDC = BeginPaint(hWnd, &ps);
             if(zeichne == true)
             {
    
                 ...Zeichnen(siehe oben)...
    
                EndPaint(hWnd, &ps);
    
                DeleteDC(hDC); <-- änderung
    
                zeichne = false;
                return 0;
                }
    
             }
    

    und der Code der im Button steht:

    zeichne = true;
    RECT rec; 
    GetClientRect(hWnd, &rec);
    InvalidateRect(hWnd, &rec, true);
    


  • setz da mal ein InvalidateRect(hWnd, 0, 1) rein.

    und deletedc ist falsch



  • So?:

    zeichne = true;
    InvalidateRect(hWnd, 0, 1);
    

    Da ist es wieder so, dass die Linien verschwinden aber sich dann nicht neu Zeichnen. Nur das Koordinatensystem.

    Vielleicht bringt es ja was wenn ihr den kompletten Code seht:
    Klick mich



  • Mir fällt so spontan auf das du zaehlen nicht neu setzt, "while(zaehlen<51)" wird wenn ich das richtig sehe daher nur 1x durchlaufen...



  • Super Danke das wars.


Anmelden zum Antworten