Habe ein OnDraw Verstaendnissproblem



  • Hallo zusammen,

    ich habe mittels dem Vc++2003 MFC Wizard eine MFC MDI Application generiert, welche auch ohne Probleme funktioniert.

    Nun hab folgendes ausprobiert:

    In der CMyApp::OnDraw methode hab ich folgende zeile

    AfxMessageBox("Test");

    Hier kommt es zu meinem Verstaendisproblem:

    Sollte nun im laufenden Programm nicht permanent besagte MessageBox mit dem "test" inhalt erscheinen, sobald ich auf OK klicke sofort wieder die gleiche Messagebox?

    Die MessageBox kommt nur am Anfang dann nicht mehr.

    Ist OnDraw etwa die falsche funktion fuer dies, wenn ja, wleche ist die richtige ?

    Hier scheint OnDraw nur einmal aufgerufen zu werden.

    Der Grund fuer das ganze ist das ich in der MFC Application mittels Direct3D rendern will und so permanentes Update brauche. Bin mittels dem kleine MessageBox test auf der suche einen passenden MFC funktion fuer den ganzen D3D update kram.

    Was ist die richtige Funktion?

    Danke!
    TheGamerBG



  • Die Funktion ist schon die richtige, aber du solltest diese nicht in der CMyApp aufrufen, sondern in einem Fenster oder einer View!!!
    Du hast die OnDraw von deiner Programminstanz (von CWinApp abgeleitete Klasse) überschrieben und deswegen bekommst du nur einmal die Messagebox



  • http://www.henkessoft.de/C++/MFC/mfc_einsteigerbuch_kapitel7.htm
    http://www.henkessoft.de/C++/MFC/mfc_einsteigerbuch_kapitel5.htm
    http://download.pearsoned.de/leseecke/VCPLUS6_21Tg/data/kap10.htm

    Schau dir die Kapitel an (ist zwar MSVC++6, sollte aber nichts ausmachen), vielleicht verstehst du dann den MFC-Aufbau besser.



  • Ups ich hab mich beim ersten Post verschrieben 😞

    Hab AfxMessageBox natuerlich in

    CMyAppView::OnDraw geschrieben. Aber es geht trotzdem nicht



  • Hier nochmal mein Code:

    void Cmfctest0001View::OnDraw(CDC* /*pDC*/)
    {
    	Cmfctest0001Doc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	if (!pDoc)
    		return;
    
    	// TODO: Code zum Zeichnen der systemeigenen Daten hinzufügen
    
    	AfxMessageBox("test");
    
    }
    

    Der rest ist wizard code und zwar unveraendert



  • Die MessageBox hat den Klassenstil CS_SAVEBITS und wird beim Verschwinden daher den überlagerten Hintergrund wiederherstellen. Es wird nichts ungültig in deinem View und daher wird auch kein OnDraw aufgerufen.

    Wenn du allerdings andere Fenster darüberschiebst oder den View größer/kleiner machst, erscheint die MessageBox wieder.



  • Das heisst, erst wenn eine variable den wert geaendert hat wir OnDraw aufgerufen?

    Das ist doch nicht gerade ne super Loesung ich meine wenn ich D3D render und in OnDraw die update funktion aufrufe was doch MFC nicht wenn sich in der update funktion was geaendert hat. Als beispiel:

    void Cmfctest0001View::OnDraw(CDC* /*pDC*/)
    {
        Cmfctest0001Doc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        if (!pDoc)
            return;
    
        AfxMessageBox("test");
    
    }
    

    und

    void Cmfctest0001View::OnDraw(CDC* /*pDC*/)
    {
        Cmfctest0001Doc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        if (!pDoc)
            return;
    
        renderSystem->update;
    
    }
    

    In keinem Fall weiss MFC das sich was veraendert hat, klar im ersten veraendert sich ja nichts, aber im zweiten permanent. Wie mache ich MFC klar das es permanent OnDraw aufrufen soll?



  • Das was du suchst könnte this->Invalidate() oder this->RedrawWindow() heissen.

    Es ist aber nicht besonders gut wenn diese Methoden innerhalb der Bearbeitung von WM_PAINT ( und damit auch OnDraw ) aufgerufen werden. Besonders letztere nicht.

    Vielleicht stimmt die Struktur deiner Anwendung nicht ?


Anmelden zum Antworten