Anzeige aktualisieren ?



  • Hallo Zusammen

    Ich habe eine dialog anwendung "MidiTestDlg.h"

    wie kann ich die anzeige im dialogfeld mit der funktion ProcessMidiBeat(void)
    verbinden so das beats angezeigt werden ?

    weiss nicht wie ich es machen soll!
    Über ein Button Funktioniert es.

    m_BeatAnzeige.Format("%d",Sync->beats);
    UpdateData(false);

    Aber es soll immer angezeigt werden ohne Button

    Kann mir jemand helfen bitte

    void MySync::ProcessMidiBeat(void)
    {
    beats++;

    //todo beat ausgabe im setupdlg

    // force any and all views to update the beats display
    /*CFrameWnd* pMainFrm = GetParentFrame();
    CDocument* pDoc = pMainFrm->GetActiveDocument();
    pDoc->UpdateAllViews(NULL);*/
    }

    Grüße Can



  • Servus,

    ähm ja ich glaube mit dem was du uns gegeben hast, kann man nicht soviel anfangen. Ich denke mal, was ein bisschen hervorgeht, das du gerne ständig eine Variable ausgespuckt haben willst. Dann solltest du diese immer in einer Funktion, welche dauerhaft aufegrufen wird, auf dem Dlg ausgeben oder du baust dir einen Timer, welcher in bestimmten Abständen dir eine Ausgabe erzeugt.

    Stichworte für MSDN: WM_TIMER, OnTimer(), SetTimer(), KillTimer()

    Ich weiss ja nicht wie, was, warum und überhaupt, keine Ahnung??? *muhh* das Programm macht, deswegen kann man nur raten.....

    *winke*
    Hellsgore



  • So wie es Hellsgore schon vorgeschlagen hat, würde ich es auch machen.

    Also: Benutze einen Timer und ruf deine Funktion alle heilige Zeit(oder kürzer) einfach solange auf bis du keine Lust mehr drauf hast.

    void CMidiTestDlg::OnTimer(UINT nIDEvent) 
    {
       if(nIDEvent==DeinEvent)
       {
          ProcessMidiBeat(void); 
          m_BeatAnzeige.Format("%d",Sync->beats); 
          UpdateData(false); 
       }
    }
    

    Die Aufrufe:
    SetTimer(DEIN_MIDI_TIMER, 500, NULL);
    KillTimer(DEIN_MIDI_TIMER);

    Ist es das, was du suchst?
    gerhardt



  • Falls du von Timern keine Ahnung hast kann ich dir dieses Tutorial
    bestens empfehlen :

    http://www.diabolo666.com/tutorials/c++/Vcplus6/kap04.htm

    Gruß
    :: NoName ::



  • Hallo zusammen
    Danke für die Antworten!!

    Den Teimer einzusetzen ist der falsch weg weil die klasse MySync schon wie ein Teimer Funktioniert.Es gibt die Beats (Takt) in einem MidiFile.
    wenn das MidiFile gestartet wird.dann sendet die funktion
    void MySync::ProcessMidiBeat(void)
    den Beat in einem MidiFile song

    Also ich denke ich müsste ergend wie die HauptDlg.h in MySync.h bekannt machen und das textfeld Aktualisieren.

    Andere Klassen In HaupDialog Klasse bekannt zu machen ist kein problem
    Aber wenn ich die HaupDlg.h Klasse in anderen klassen wie MySync bekannt machen möchte und eine instanz anlegen will funktioniert es nicht.

    Hier die MySync Klasse

    //===========================================================================
    // MySync Class
    //===========================================================================
    #include "stdafx.h"
    #include "MySync.h"

    BEGIN_MESSAGE_MAP(MySync, CMaxMidiSync)
    //{{AFX_MSG_MAP(MySync)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    //---------------------------------------------------------------------------
    // Constructor
    //---------------------------------------------------------------------------
    MySync::MySync()
    {
    beats = 0;
    IsRecording(FALSE);
    }

    /////////////////////////////////////////////////////////////////////////////
    // MySync virtual functions

    //---------------------------------------------------------------------------
    // ProcessSyncDone
    //---------------------------------------------------------------------------
    void MySync::ProcessSyncDone(void)
    {
    // stop playback, but only if not recording
    if(!IsRecording())
    Stop();
    //todo evt. im loop laufen lassen wenn ende erreicht
    }

    //---------------------------------------------------------------------------
    // ProcessMidiBeat
    //---------------------------------------------------------------------------
    void MySync::ProcessMidiBeat(void)
    {
    beats++;

    //todo beat ausgabe im setupdlg

    // force any and all views to update the beats display
    /*CFrameWnd* pMainFrm = GetParentFrame();
    CDocument* pDoc = pMainFrm->GetActiveDocument();
    pDoc->UpdateAllViews(NULL);*/
    }

    Dieser code ist normale weise eine MenueAnwendung
    ich habe ein teile ausgeklammer.das ausgeklammerte teil Aktualiesiert die beat anzeige im MenueFeld. der code muss doch auch ergendwie für Dialog Anwendung geben.

    oder wenn ich von MySync.cpp aus zugriff auf die Members der HauptDialog klasse hätte. währe mein problem gelöst.

    Grüße Can



  • Ein Timer ist sowieso der falsche WEG selbst wenn deine Klasse bereits irgendwie einen Timer verwendet oder was auch immer.

    Was Du brauchst sind Threads.
    Stichwort: CWinThread


Anmelden zum Antworten