Gittermuster zeichnen



  • Hallo,

    ich steige gerade in die WinAPI ein und versuche ein Gittermuster zu zeichnen.

    while (!pparams->bKill)
         {
             if(drawactive == 1)
                break;
    
            hdc = GetDC (pparams->hwnd) ;
    
            //InvalidateRect (pparams->hwnd, NULL, TRUE) ;
            //UpdateWindow (pparams->hwnd) ;
    
            iDiameter = 50;
    
            Rectangle (hdc, 0,
                            0,
                            (x + iDiameter),
                            (y + iDiameter)) ;
    
            x += iDiameter;
            y += iDiameter;
    
            ReleaseDC (pparams->hwnd, hdc) ;
            Sleep(2000);
    
         }
    

    Mit diesem Code zeichnet es mir ein Quadrat und nach 2 Sekunden wird das Quadrat einfach nur vergrößert dargestellt und das eben alle 2 sekunden.

    Ich möchte aber, dass sich das Quadrat vergrößert, ein neues Quadrat erstellt wird mit neuen Maßen, sodass eine Art Gitternetz entsteht.

    Was muss ich beachten? Wo liegt mein Fehler?


  • Mod

    Zeichne nur im OnPaint Handler. Setze einen Timer und im Handler des Timers machst Du einen entsprechenden Invalidate, dass löst wieder den WM_PAINT aus.



  • Tss... wie kann man nur auf die Idee kommen das ein Rechteck, was immer die selben x und y Koordinaten hat(0) und nur in der Breite und Höhe verändert wird, sich verschiebt?



  • looooooooooooooooooooooool

    du bist :schland:



  • Evil
    ich habe mich etwas kompliziert ausgedrückt. Ich möchte, dass wenn sich das Quadrat nach 2 sek. vergrößert, dass das alte Quadrat nicht gelöscht wird.

    Das mit dem Startpunkt 0/0 ist mir auch klar, das würde ich dann noch ändern.

    Mein Problem ist, dass ich nciht weiß, wie ich mehrere Quadrate zeichnen kann, ohne mehrere male die Funktion Rectangle aufzurufen, denn es sollen beliebig viele Quadrate werden.

    Ich möchte mit einer Schleife, darin ein Rectangle Aufruf, mehrere verschieden große Quadrate zeichnen.

    Hoffe jetzt ist es verständlicher, Evil.

    @MArtin Richter
    Vielen Dank. Ich versteh aber leider nicht so ganz was du mit OnPaint Handler meinst und auf was du hinaus willst. Ich werd mal danach googlen.



  • Tjo... das nennt man dann mal Ahnung 😉

    Also mit OnPaint Handle ist im normal Fall die WM_PAINT Message gemeint... darin zeichnet normalerweise.

    UND NEIN! Die Rectangle Funktion zeichnet immer nur EIN Rechteck... allerdings kann die Funktion durchaus mehrmals aufgerufen werden, wobei, sobald das neue Rechteck über dem alten liegt diese Stelle vom alten einfach übermalt wird.



  • Mir ist klar, dass Rectangle immer nur ein Rechteck malt. Ich schrieb ja auch, dass ich die Funktion, z.B. über eine Schleife mehrmals ausführen möchte. Und ja, immer mit verschiedenen Daten. So möchte ich eigentlich erreichen, dass ich mehrere Rechtecke zeichne und sehe, aber es wird immer nur ein Rechteck angezeigt. Was mache ich falsch?



  • Nur so als Anmerkung: "Guttermuster" zeichnet man normalerweise mit einen "Hatch-Brush"... siehe HS_CROSS und CreateHatchBrush



  • das ist nicht das was ich möchte, trotzdem danke für den tipp.

    Mal ne andere Frage:

    Ich zeichne momentan viele Rechtecke nebeneinander in ein Fenster:

    while (!pparams->bKill)
         {
             if(drawactive == 1)
                break;
    
            for(i = 0; i < 10; i++)
            {
                Rectangle(hdc, x, y, x+50, y+50);
                x += 50;
            }
    
            x = 0;
            y += 50;
            Sleep(2000);
         }
    

    Dabei werden die letzten paar Rechtecke nur zur Hälfte bzw. gar nicht mehr dargestellt, weil sie außerhalb des Fensters liegen.

    Werden diese nicht dargestellten Fenster trotzdem gezeichnet? Wenn ja, kann man das unterdrücken, quasi ein abbruch, sobald das Programm bemerkt, dass das Rechteck nicht mehr oder nur zur Hälfte darstellbar ist?



  • Hat man Dir nicht schon mal gesagt, das man Zeichen nur auf die Reaktion zu WM_PAINT machen sollte!?



  • ja ok chef, ich werds mir merken.


Anmelden zum Antworten