OpenGL mit der MFC, OnDraw



  • Hallo,

    ich beschäftige mich seit kurzem mit der Windows-Programmierung über die MFC mit dem Ziel, eine Anwendung mit einer OpenGL-Darstellung dreidimensionaler Objekte zu erstelln.

    Habe auch einen Haufen Tutorials dazu gefunden und arbeite mich mit einigen Büchern ins Thema MFC ein. Soweit, so gut.

    Jetzt tue ich mich aber mit dieser ereignisorientierten Denkweise noch recht schwer:

    Ich habe ein Beispielprogramm gefunden (www.francisshanahan.com/detail.aspx?cid=137), das funktioniert und mir soweit klar ist. Was ich nicht verstehe: Das Programm animiert OpenGL-Objecte. Innerhalb der OnDraw()-Funktion steht folgendes:

    void ....::OnDraw(CDC *pdDC)
    {
    static int i = 0
    
    i+= 1.11;
    
    .
    .
    .
    //Jetzt folgen OpenGL-Aufrufe mit i als Winkel für die Objekte
    
    SwapBuffers(m_myhDC);
    
    Invalidate(FALSE)
    }
    

    Also wird durch WM_PAINT die OnDraw-Funktion aufgerufen und dabei die Variable i inkrementiert, wodurch die GL-Objekte andere Winkel bekommen und sich beim nächsten OnDraw() gedreht darstellen. Ist das richtig?

    Aber normalerweise müßte doch eine Fehlermeldung kommen, weil i bei jedem Aufruf von i neu definiert wird!? Oder hat das was mit static zu tun!?

    Außerdem: Wodurch wird überhaupt sichergestellt, daß OnDraw() regelmäßig aufgerufen wird? Muß dazu nicht das Fenster verschoben/die Größe verändert werden? Oder ruft die Funktion sich selbst irgendwo wieder auf - was mit dem Invalidate()?

    Ist wahrscheinlich keine wilde Sache, bei mir hakt's aber noch 🙄

    Danke für Eure Tipps,

    Tobias



  • das hat was mit static zu tun.



  • ... und was ...?

    Schließlich wird jedesmal i zu Null gesetzt beim Aufruf, oder...!?



  • ... okay, und was? ...

    Müßte nicht eigentlich bei jedem Aufruf das i zu Null gesetzt werden?



  • Hallo,

    tronaccount schrieb:

    Müßte nicht eigentlich bei jedem Aufruf das i zu Null gesetzt werden?

    aber nein, das ist ja das Wesen von static-Variablen, sie werden nur einmal initialisiert und behalten dann ihren aktuellen Wert über Funktionsaufrufe hinweg immer bei.

    MfG


Anmelden zum Antworten