Neuzeichnen des Clientbereiches einer SDI - Anwendung?



  • Wie schon im im Thema genannt habe ich eine SDI - Anwendung erstellt.
    In der Ansichtsklasse werden Mathematische Funktionen grafisch dargestellt,
    das klappt auch wunderbar.

    Nun mein Problem:
    Ich hab der Anwendung einen Dialoge (modale Dialoge) spendiert mit deren
    Hilfe ich über Schieberegler die Graphen der dargestellten Funktionen
    verändern will (Bsp. ich verändere Stauchung der Parabel)

    prinzipell funktioniert alles, aber die "OnDraw" - Funktion der Ansichtsklasse soll vom Dialog ausgelöst werden, wie geht das ?

    mfg sclearscreen



  • Invalidate() der View auslösen.



  • Irgendwie hat ich das schon das sah dann so aus:

    void CGraphparamDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
        // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen   
        CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
        Invalidate(); // zeichnet nur denn Dialog neu
                          // es soll aber "OnDraw(...);" von "CGraphView" ausgelöst
                          // werden
    }
    

    wie gesagt, dieses "Invalidate();" bewirkt aber nur das der Dialog neugezeichnet wird! 😞
    Bei mir soll aber die "OnDraw(... , ...);" - Methode der Ansichtsklasse
    über die Slidersteuerlemente des Dialog ausgelöst werden:

    void CGraphView::OnDraw(CDC* pDC)
    {   
        CGraphDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        // ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügen
        if(paramDlg)
        {
            parabel.m_stauchung = paramDlg.m_Stauchung.GetPos();
            parabel.m_x_delta   = paramDlg.m_X_delta.GetPos();
            parabel.m_y_delta   = paramDlg.m_Y_delta.GetPos();
            parabel.m_zoom      = paramDlg.m_zoom.GetPos();
        }
    
        drawAxis(pDC, 500/2);
        drawGraph(pDC, pDoc, 500/2);
    }
    

    Man müsste also im Dialog sowas wie ähmm "UpdateView();" oder so aufrufen können
    sodass das "OnDraw(...);" in der View angesprungen wird, mit "Invalidate();"
    komm ich nisch weiter!

    Da muss es etwas anderes geben! 😕

    mfg sclearscreen



  • Du brauchst in deinem Dialog einen Zeiger auf die View oder auf das Doc-Objekt. Also richte dort ne Variable dafür ein, und initialisier sie beim Aufruf des Dialogs. Wenn du einen Zeiger auf das Dokument hast, dann machst du es so:
    pDoc->UpdateAllViews();
    Falls es ein Zeiger auf die View ist (ich weiß ja nciht von wo aus dein Dialog aufgerufen wird, also welcher Zeiger für dich einfacher bereitzustellen ist) :
    pView->Invalidate();


Anmelden zum Antworten