tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
1362
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    titanic titanic ist offline Mitglied Silber
    Registriert seit
    May 2006
    Beiträge
    60
    Hallo Leute,

    ich habe eine SDI-Anwendung. In der InitInstance() der Applikation
    zeige ich ein nicht modales Dialog an. Dann starte ich in der OnInitDialog()
    einen Timer, aber das WM_TIMER Ereignis empfange ich nicht.
    Wieso? Ich vermute, das hat was mit der Nachrichtentabelle zu tun.
    Kann mir da jemand helfen?

    titanic
     

  2. #2
    titanic titanic ist offline Mitglied Silber
    Registriert seit
    May 2006
    Beiträge
    60
    Hallo,

    Das ich die Windows-Nachrichen nicht empfangen kann liegt wohl am nicht modalen
    Dialog.

    Um die Nachrichten zu verarbeiten rufe ich die PeekMessage() auf.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
    //-----------------------------------------------------------------------
    //-----------------------------------------------------------------------
    BOOL CMFLStartDlg::OnInitDialog()
    {
        
        CDialog::OnInitDialog();
     
        SetStartDlgTimer();
        UpdateStartDlgMessage();
     
        return TRUE;  // return TRUE unless you set the focus to a control
        // AUSNAHME: OCX-Eigenschaftenseite muss FALSE zurückgeben.
    }
    //-------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------
    void CMFLStartDlg::SetStartDlgTimer()
    {
        if (m_uStartDlgTimer == 0)
        {
            m_uStartDlgTimer = (UINT)SetTimer(START_DLG_TIMER_ID, 100, NULL);
        }
    }
    //-------------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------
    void CMFLStartDlg::UpdateStartDlgMessage()
    {
        MSG message;
        while(PeekMessage (&message, NULL, 0, 0,PM_REMOVE))
        //while(GetMessage(&message, 0, 0, 0))
        {
            TranslateMessage(&message);
            DispatchMessage(&message);
        }
     
    }
    Bleibt mir denn nichts anderes übrig, als die Nachrichten manuell zu verarbeiten?
     

  3. #3
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Wenn du innerhalb der Funktion OnInitDialog bist, bist du gerade mitten in der Nachrichten verarbeitung. Deshalb solltest du da keinesfalls eine zweite MessageSchleife mit einbauen.

    Nimm mal das UpdateStartDlgMessage da raus, die MessagePump hat MFC schon für dich erledigt (es sei denn, du spielst mit Threads rum).
     

  4. #4
    titanic titanic ist offline Mitglied Silber
    Registriert seit
    May 2006
    Beiträge
    60
    Danke dir Endurion für die Antwort,

    ich versuche mal mein Vorhaben etwas konkreter zu beschreiben.

    ich habe eine SDI-Anwendung mit einem SplitterWnd.

    Ich möchte, dass beim Starten der Anwendung ein Logo(Bild) angezeigt wird.
    Umgesetzt habe ich es mit einem ramenlosem Dialog, wo ich eine Bitmap platziere.
    Das Dialogfeld wird in CMainFrame::OnCreateClient(..) zu Begin der Funktion
    nicht modal angezeigt und am Schluss(der Funktion) zerstört.

    Eins der Panes des SplitterWnd-Objekts ist ein TreeView, wo ich die Laufwerke anzeige. Dieser Prozess kann unterschiedlich lang dauern. Deshalb wollte ich mit dem Timer die Zeit messen und so die Anzeige-Dauer des Dialogs steuern.

    Wenn ich die Windows-Nachrichten des Dialogs nicht manuell bearbeite, bekomme ich sie gar nicht(OnTimer()) wird gar nicht aufgerufen.

    Wieso einfach, wenn es auch kompliziert geht?
    Beim Erzeugen des Dialogs merke ich mir die System-Zeit
    und vor dem Zerstören rechne ich die Differenz aus,


    Tja,
    wie holt man die Systemzeit?
     

  5. #5
    langer1801 langer1801 ist offline Mitglied Platin
    Registriert seit
    Jun 2005
    Ort
    Bad Arolsen (Hessen)
    Beiträge
    556
    Hallo,

    Code :
    1
    2
    
        SYSTEMTIME stm;
        GetSystemTime(&stm);

    in stm stehen alle Infos.

    Mfg

    langer
     

  6. #6
    titanic titanic ist offline Mitglied Silber
    Registriert seit
    May 2006
    Beiträge
    60
    Danke,
    ich habe es jetzt so umgesetzt:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    BOOL CMFLStartDlg::OnInitDialog()
    {
        CDialog::OnInitDialog();
        m_createTime = CTime::GetCurrentTime();
     
        return TRUE;  // return TRUE unless you set the focus to a control
        // AUSNAHME: OCX-Eigenschaftenseite muss FALSE zurückgeben.
    }
    inline void CMFLStartDlg::LeerLauf(int in_nAnzeigeDauerSec)
    {
        CTime destroyTime = CTime::GetCurrentTime();
        CTimeSpan timeSpan = destroyTime - m_createTime;
        int sec = (int)timeSpan.GetTotalSeconds();
        if (sec<0) sec=0;
     
        while (sec < in_nAnzeigeDauerSec)
        {
            Sleep(1000);
            sec += 1;
        }
    }
    //-----------------------------------------------------------------------
    //-----------------------------------------------------------------------
    void CMainFrame::DeleteStartDlg()
    {
        if (m_pStartDlg != NULL)
        {
            m_pStartDlg->LeerLauf();
            delete m_pStartDlg;
            m_pStartDlg = NULL;
        }
    }

    Eine offene Frage habe ich noch.
    Glaube irgendwo gelesen zu haben,
    dass die WM_TIMER-Nachricht eine sehr geringe Priorität hat,
    könnte man sie denn auch ändern?

    blei
    Trotzdem wüsste ich gern, wie ich
     

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 11.01.11, 21:40
  2. Antworten: 4
    Letzter Beitrag: 22.03.06, 20:50
  3. OnTimer unterbrechung
    Von masa im Forum VisualStudio & MFC
    Antworten: 3
    Letzter Beitrag: 18.12.04, 21:04
  4. Antworten: 0
    Letzter Beitrag: 06.10.04, 14:03
  5. Antworten: 6
    Letzter Beitrag: 13.06.02, 12:29