OnTimer in von CWnd abgeleiter Klasse verwenden



  • Hallo,

    ich habe mit dem Klassenassisten von Visual C++ 6.0 eine neue, von CWnd abgeleitete Klasse erstellt. Im Konstruktor dieser Klasse führe ich die SetTimer-Funktion aus (alá SetTimer(1,500,NULL) ).

    Dann habe ich, ebenfalls mit dem Klassenassistenten, die Funktion zur Verarbeitung der WM_TIMER-Nachricht (also OnTimer) erstellt. In dieser mache ich zum testen ein "MessageBeep(0xFFFFFFFF)".

    Mit diesem Spy++ Tool sehe ich, daß der Timer schön brav seine Nachrichten abschickt. Leider "empfängt" die erstellte OnTimer-Funktion diese Nachricht nicht.

    Hier der relevante Code:
    ------------------------
    CTimerTest::CTimerTest()
    {
    m_hWnd = AfxGetMainWnd()->m_hWnd; //[1]

    SetTimer(1,500,NULL);
    }
    -----------------------
    void CTimerTest::OnTimer(UINT nIDEvent)
    {
    //CWnd::OnTimer(nIDEvent);

    MessageBeep(0xFFFFFFFF);
    }
    --------------------------------

    [1]Ohne diese Anweisung gibt's einen "Debug Assertion" Fehler oder so, wohl weil m_hWnd = NULL ist oder irgendwas unbrauchbares.

    Meine Vermutung ist, daß die Nachricht nur an "höhere Instanzen" im Programm geht, wegen dieser m_hWnd-Anweisung.

    Hat vielleicht jemand einen Tip, wie ich das machen könnte? Geht das so überhaupt, wie ich mir das vorstelle? Falls das nicht geht, hat jemand eine idee, wie man was vergleichbares sonst machen könnte? Wie macht Ihr sowas?

    Schonmal vielen, vielen Dank für die Antwort, ich sitz jetzt schon geraume Zeit dran 😉

    Gruß,

    Christian



  • Hi,

    das kann nicht funktionieren.
    Im Konstruktor der CWnd Klasse ist das Fenster noch nicht initialisier
    =>m_hWnd ist NULL.

    Du darfst also den Timer erst dann erstellen, wenn das Fenster initialisiert wurde (z.B. in OnCreate()).

    Grüße Rapha
    ps. Du kannst (neben der Nachrichtenmethode (=WM_TIMER)) auch über eine Funktion auf ein Timerereignis reagieren:

    UINT SetTimer(
    HWND hWnd, // handle of window for timer messages
    UINT nIDEvent, // timer identifier
    UINT uElapse, // time-out value
    TIMERPROC lpTimerFunc // address of timer procedure
    );

    Parameters
    hWnd
    Handle to the window to be associated with the timer. This window must be owned by the calling thread. If this parameter is NULL, no window is associated with the timer and the nIDEvent parameter is ignored.
    nIDEvent
    Specifies a nonzero timer identifier. If the hWnd parameter is NULL, this parameter is ignored.
    uElapse
    Specifies the time-out value, in milliseconds.
    lpTimerFunc
    Pointer to the function to be notified when the time-out value elapses. For more information about the function, see TimerProc.
    If lpTimerFunc is NULL, the system posts a WM_TIMER message to the application queue. The hwnd member of the message'sMSG structure contains the value of the hWnd parameter.

    => Dann könntest du den Timer im Konstruktor erstellen



  • Hi, danke für die flotte Antwort! Meine dauerte nun ein wenig länger 😉

    Da die Klasse, in der ich den Timer aufrufe, einfach eine "Klasse" ist, kein Fenster, welches geöffnet wird, gibt es kein OnCreate, wenn ich das richtig verstehe. Aber wie dem auch sei, ich werde die Lösung mit der extra Funktion mal versuchen. Ich hab das tatsächlich schonmal probiert, das ging aber nicht, da ich nicht so recht wußte, wie ich den aufzurufenden Funktionsnamen in "SetTimer" bekannt machen sollte. Hab dann aufgegeben, weil ich dachte etwas anderes sei die Ursache des Problems. Werde nun mal ein wenig hartnäckiger sein...

    Danke nochmal und ciao,

    Christian


Log in to reply