Zugriff von Child auf Hauptdialog



  • Hallo

    Ich habe ein oft angesprochenes und diskutiertes Problem, aber trotzdem komme ich mit den Beiträgen dazu nicht zu einer Lösung.

    Also ich habe ein Dialogfenster (DF). Das DF enthält eine Variable namens m_oglWindow vom Typ "OpenGLControl" (eine Klasse, abgeleitet von CWnd zur Verwaltung eines OpenGL Fensters). Vom DF aus rufe ich die Funktion

    m_oglWindow.oglCreate( rect,  this )
    

    auf.

    In der eigentliche create-Funktion speichere ich den Zeiger dann wie folgt:

    void COpenGLControl::oglCreate( CRect, CWnd *parent );
    {
         ...
         hWnd = parent;
    }
    

    CWnd *hWnd; ist die vorherige Definition natürlich

    Nun möchte ich (wie man sicher schon ahnt 😉 ) aus dem m_oglWindow auf den Papa zugreifen, etwa so

    void COpenGLControl::loadFile()
    {
         object.import3ds( "C:\modell.3ds" );
         hWnd->updateVertices( object->getvertexnum() );
    }
    

    Ich lade also eine *.3ds Datei ein und lese die Anzahl der Eckpunkte aus. Das funktioniert auch problemlos. Aber wenn ich im DF über die Prozedur "updateVertices(int i)" die entsprechende Variable ändern will, heißt es stets "... : error C2039: 'updateVertices' : Ist kein Element von 'CWnd'. Ich habe gelesen, dass ich auf die public-Funktionen des parent zugreifen kann und sie ist auch als public deklariert.
    Was mache ich also falsch? 😕

    MfG
    Neron



  • Aber dein parent ist doch gar kein OpenGLControl 😕



  • connan schrieb:

    Aber dein parent ist doch gar kein OpenGLControl 😕

    Richtig, mein parent ist (wenn ich alles richtig gemacht habe) das DF. Ich habe im Dialogfenster noch weitere Elemente, unter anderem eines für die Anzeige der Eckpunktanzahl. Daher möchte ich aus OpenGLControl auf das DF zugreifen können 🙂



  • Wie wär es denn mit einem cast auf Deinen parent, also sowas wie

    ((CMyDialog *)hWnd)->updateVertices( object->getvertexnum() );



  • jencas schrieb:

    Wie wär es denn mit einem cast auf Deinen parent, also sowas wie

    ((CMyDialog *)hWnd)->updateVertices( object->getvertexnum() );

    Leider tritt noch immer der gleiche Fehler auf 😞



  • Aber doch bestimmt nicht mit dieser Fehlermeldung "... : error C2039: 'updateVertices' : Ist kein Element von 'CWnd'", oder????



  • Doch, genau die gleiche...



  • Von welchem Type ist hWnd?



  • Du kannst nur von deinem Dialog aus m_oglWindow.updateVertices(...) aufrufen, dein Dialog, da kannst du casten wie du willst, hat die Methode einfach nicht.



  • (D)Evil schrieb:

    Von welchem Type ist hWnd?

    CWnd* 🙄



  • Hm, vielleicht nochmal etwas besser beschreiben:

    Ich habe eine Dialogklasse namens CProjectDlg. Die hat als eine Variable ein OpenGLControl (das m_oglWindow).

    Ich rufe in CProjectDlg::OnInitDialog die Funktion m_oglWindow.oglCreat( rect, this) - dort übergebe ich wie beschrieben den Zeiger auf CProjectDlg

    Dann rufe ich im m_oglWindow die Funktion OpenGLControl::loadFile() - in dieser Funktion möchte ich auf eine Funktion aus CProjectDlg zugreifen, nämlich die CProjectDlg::updateVertices(int i)

    Vielleicht ist die Problematik so etwas deutlicher 🙂

    Vielen Dank schon mal für die Unterstützung



  • Dann sollte dass funktionieren:

    ( (CProjectDlg*)(hWnd) )->updateVertices( object->getvertexnum() );
    


  • Ja, klasse. Das funktioniert 🙂

    Vielen vielen Dank an alle, die sich Mühe gemacht haben.

    MfG
    Neron



  • Tja, sowas hatte ich aber auch schon geschrieben.....



  • Ich hab auch von dir 'zitiert'... 😉



  • Sorry jencas - Ich sehe grad, dass ich bei deinem Code die äußeren Klammern um (CDialog*)hWnd vergessen habe, dadurch wohl der Fehler - heißt das, der Zugriff auf die Operation geht in der Reihenfolge vor den Cast?



  • (CProjectDlg*)(hWnd)->updateVertices( object->getvertexnum() );
    

    ist dasselbe wie

    (CProjectDlg*)(hWnd->updateVertices( object->getvertexnum() ));
    

    deswegen ist es auch bei derselben Fehlermeldung geblieben!!!


Anmelden zum Antworten