Von aus Dialog genutzer Klasse im Dialog zeichnen.



  • Hi an alle,

    ich habe einen Dialog, welcher eine Klasse aufruft die Sound erzeugt.
    Der Sound wird über DirectX innerhalb von Lock erzeugt und soll dann mit Play abgespielt werden.
    Nun möchte ich innerhalb des Locks die erzeugten Signalwerte in einer PictureBox zeichnen. Wie bekomme ich jetzt von meiner Soundklasse aus Zugriff auf den Dialog?
    Hier ein Auschnitt wo auf den Dialog zugegriffen werden soll.

    unsigned CSinSoundBuffer::BufferingThread(void *pParam)
    {
       CSinSoundBuffer* pBuf = (CSinSoundBuffer*)pParam;
       LPVOID p1, p2;
       DWORD size1, size2;
    
       while(pBuf->m_bRun)
       {
          //Puffer zum Schreiben sperren
          pBuf->m_pSoundBuffer->GetSoundBuffer()->Lock(0, pBuf->m_pSoundBuffer->GetBufferSize(), //ganzen Puffer sperren
                   &p1, &size1, //x Bytes ab Puffer 1
                   &p2, &size2, //x Bytes ab Puffer 2
                   0);
    
          //Sinus erzeugen
          DWORD i;
          BYTE* t; //zeigt auf 16bit
    
          for(i=0, t=(BYTE*)p1; i<(size1 + size2); i+=2)
          {
             if(i > size1)
                t=(BYTE*)size2;
             //1 Kanal je 16bit
             *(short int*)(t+i) = *(short int*)(t+i+2) =
                (short)(sin(2*3.141592 + pBuf->m_nFrequenz*i/pBuf->m_pSoundBuffer->GetBufferSize())*
                      pBuf->m_fAmplitude * 32768);
          }
          // Von hier muss ich nun auf meine Funktion im Dlg kommen.
          pBuf->m_pSoundBuffer->GetSoundBuffer()->Unlock(p1, size1, p2, size2); //hier geschriebene Bytes
       }
       return 0;
    }
    


  • Das einfachste was ich mir gerade vorstellen kann ist einen Zeiger auf den Dialog zu setzen. 🙂



  • Aber die Klasse selbst ist ja bereits im Dialog deklariert.



  • mr. main schrieb:

    Aber die Klasse selbst ist ja bereits im Dialog deklariert.

    Achso, eventuell von der Dialogklasse ableiten?



  • Ne die Klasse hat ja nix mitm Dialog gemein.
    Ich dachte eher an eine Art Interface das zwischen den beiden vermittelt
    aber ich wüßte nicht wie und ob man so etwas realisieren kann.



  • Naja, wenn ich das richtig verstanden hab möchtest du über deine Klasse Änderungen am Dialog vornehmen und eventuell Daten davon nutzen bzw. Funktionen.

    Dann wäre doch ein Zeiger auf den Dialog möglich.



  • Ja schon richtig verstanden.
    Also mein Klasse vom Dialog ableiten und dann einen Zeiger auf den Parent der Klasse machen seh ich das richtig?



  • Naja dann brauchst du nicht ableiten.

    Der aufruf der Klasse erfolgt ja sicher im Dialog.
    In deiner Klasse setzt du einen Include auf die Headerdatei deines Dialogs.
    Dann setzt du innerhalb deiner Klasse eben den Zeiger als Property.

    Also zb. so:

    MyDlg *dialog;
    

    Und wenn du nun in deinem Dialog die Klasse startest, setzt du eben den Property.

    So zb:

    CSinSoundBuffer buffer;
    buffer.dialog = this;
    


  • Werds mal probieren, danke für den Tipp.
    Sowas hab ich auch noch nicht gemacht.



  • Wenn ich jetzt aber meine Dialog in der Klasse inkludiere, was ich von Anfang an befürchtet hatte bekomme ich diese Fehlermeldungen für die Klasse und den Dialog

    1>c:\projects\mytool\audiotest.h(28) : error C2143: syntax error : missing ';' before '*'
    1>c:\projects\mytool\audiotest.h(28) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\mytool\audiotest.h(28) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    


  • Was steht denn in der Zeile, aus der der folgende Fehler kommt?

    1>c:\projects\mytool\audiotest.h(28) : error C2143: syntax error : missing ';' before '*'
    

    Nett wäre es 2-3 Zeilen vor und nach der Meldung zu sehen. 🙂



  • CStatic* m_stPb1;
        DECLARE_MESSAGE_MAP()
    public:
       afx_msg void OnBnClickedOk();
       afx_msg void OnBnClickedCancel();
    
    private:
    ->   CSinSoundBuffer* m_pSinBuf; //Hier meckert der Compiler das fehlende Semikolon an. 
       CDirectSound* m_pSoundCtrl;
    

    Nehme ich den include auf den Dialog aus der Klasse wieder raus dann wird auch wieder korrekt kompiliert.
    Sollte man solche Rückwärtsinkludierungen nicht eigentlich auch meiden?



  • Kannst du den Zeiger verwenden, wenn der include weg ist?
    Wenn ja dann lass ihn weg.

    Zum Thema Rückwärts includieren müsste ich dir allerdings recht geben.

    Wobei ich es gerade sehe, der Zeiger den du setzen solltest wäre nicht im Dialog sondern in deiner Klasse richtig gewesen.

    Du setzt ja in deinem Dialog einen Zeiger auf die Klasse, jedoch sagte ich in der Klasse einen Zeiger auf den Dialog.



  • Aber wie instanziier ich dann ein Objekt auf meine Klasse welche ja auch im Dialog benötigt wird.



  • Ach du wolltest deine Klasse dort als Property Zeiger initialisieren?

    Wobei ich mich da frage, warum er einen Fehler wirft. Bringt er noch einen Fehler, dass er den Datentyp "CSinSoundBuffer" nicht kennt?



  • Ne habe den Fehler gerade beseitigt in dem ich vor der Deklaration der Klasse CSinSoundBuffer die Vorwärtsdeklaration mache anstatt nem include als
    class CAudiotest;

    Jetzt klappt es wie gewünsch und ich kannaus der Klasse auf den Dialog zugreifen.
    Aber danke für die Unterstützung bis hierhin. 👍



  • Ich war wohl etwas zu vorschnell, jetzt meckert der Compiler sobald ich innerhalb der Klasse auf Methoden aus dem Dialog zugreifen will und gibt diese
    Fehlermeldung aus.

    1>c:\projects\gsm testtool\sinsoundbuffer.cpp(47) : error C2027: use of undefined type 'CAudioTest'
    1> c:\projects\gsm testtool\sinsoundbuffer.h(11) : see declaration of 'CAudioTest'
    1>c:\projects\gsm testtool\sinsoundbuffer.cpp(47) : error C2227: left of '->DrawCurves' must point to class/struct/union/generic type

    Deklariert wird wie folgt

    class CAudioTest; //Vorwärtsdek.
    class CSinSoundBuffer
    {
       ...
       CAudioTest* myDlg;
       ...
    }
    
    //Zugriff in der Methode der Klasse
    myDlg->DrawCurves(Wert, Wert);
    
    //Im Dialog wird nach Instanziierung der Klasse
    m_pSinBuf->myDlg = this;
    


  • Hast du vorwärts und Rückwärtsinclude drin?



  • Nein nur vorwärts



  • Setz mal noch den Rückwärts-Include und gib dann mal bescheid was dein Compiler sagt. 😉


Anmelden zum Antworten