Tastendruck im Unter-Dialog



  • Hallo,
    ich stehe mal wieder vor einem kleinen Problem und komme einfach nicht weiter. Auch die anderen Beiträge und Suchmaschinen konnten bisher nicht weiterhelfen, obwohl es sicher eine einfache Lösung gibt.

    Ich habe eine Dialog-Anwendung, bei der im Haupt-Dialog ein Prozess abläuft. Dieser Prozess startet dann einen Unter-Dialog, der nur einen Fortschrittsbalken enthält. Die Ansteuerung das Fortschrittsbalkens und allen anderen Aktivitäten im Unterdialog werden direkt von dem Prozess im Hauptdialog ausgeführt.

    Wenn jetzt während der Unterdialog angezeigt wird die Taste ESC gedrückt wird, solle eine Variable von True auf False gesetzt werden.

    Der Progress-Dialog wird wie folgt gestartet:

    //Show Release Progress
    pApp->pProgHDR->Create(CProgressHDR::IDD);
    pApp->pProgHDR->ShowWindow(SW_SHOWNORMAL);
    pApp->pProgHDR->m_Progress1.SetRange(0, 100);	
    pApp->pProgHDR->m_Progress1.SetPos(0);
    pApp->pProgHDR->UpdateWindow();
    

    Deklaration:

    CProgressHDR* pProgHDR;
    

    CProgressHDR ist nicht Modal, hat aber die Eigenschaft Topmost und ist ein Toolfenster.

    Aktueller Stand:
    Wenn während der Anzeige der Progress-Dialogs ESC gedrückt wird, passiert zunächst gar nichts. Nach schließen des Dialogs mit

    pApp->pProgHDR->CloseWindow();
    pApp->pProgHDR->DestroyWindow();
    

    wird PreTranslateMassege des Hauptdialogs ausgeführt.

    Frage:
    Wie bekomme ich es hin, dass der Tastendruck nicht erst nach schließen des Dialogs sondern sofort abgearbeitet wird?
    Durch ESC soll eine Variable auf False gesetzt werden. Der laufende Prozess fragt diese immer wieder an definierten Stellen ab und beendet dann den Prozess kontrolliert.

    Wäre echt toll wenn jemand einen Tipp für mich hätte.

    mfg Thinux


  • Mod

    Dann musst Du auch die Messageloop abfragen. Nachrichten kommen nur an, wenn man diese auch abholt...

    MSG msg;
    while(::PeekMessage(&msg,NULL,NULL,NULL,PM_NOREMOVE))
        AfxPumpMessage();
    

    Achtung. Damit wird Dein Programm reentrant... alle anderen Controls/Fenster/Dialoge, die keinen Input erhalten sollten müssen diables sein.



  • Danke schön. Das war's was ich vergessen hatte.

    Für alle die es genau wissen wollen:

    Ich habe die von M.Richter genannten Zeilen in die Schleife des Hauptdialoges eingefügt, die auch die Progressbar des Dialoges steuert.

    Zudem fange ich in der Funktion PreTranslateMessage des Subdialogs den Tastendruck auf ESC ab.

    if(pMsg->message == WM_KEYDOWN) {
        if(pMsg->wParam == VK_ESCAPE)
            return 0;
    }
    return CDialog::PreTranslateMessage(pMsg);
    

    Es wird PreTranslateMessage des Hauptdialoges ausgeführt. Hier findet dann die eigentliche Reaktion auf den Tastendruck statt.

    nochmals vielen Dank.
    mfg Thinux


Log in to reply