deaktivieren eines ganzen Dialogs



  • Wie kann ich in VC++ einen ganzen Dialog mit allen Schaltflächen deaktivieren? Wie man einzelne Schalter deaktiviert oder unsichtbar macht, weis ich. Das Ziel soll sein, daß es nach Betätigen einer Schaltfläche für eine bestimmte Zeit nicht möglich ist, weitere Schalter zu betätigen. Vielleicht kann mir jemand einen Tip zu einer passenden Funktion geben. Das Programm wird ein SDI, die betreffende Klasse ist eine View. Danke.



  • Hallo,

    mit

    EnableWindow(FALSE);
    

    wird das ganze Fenster gegen jegliche Eingabe gesperrt...

    MfG



  • Hm, ja danke, Probe-Nutzer, der Befehl EnableWindows(FALSE); ist mir bekannt. Das Problem daran ist, daß der Schalter (das Fenster) auf den dieser Befehl angewendet wird, auch sichtbar deaktiviert wird. Es soll in dem Programm eine (virtuelle Klavier-)Tastatur für 3 Sekunden für weitere Eingaben gesperrt werden, und dann wieder zur Verfügung stehen. Wenn ich jetzt die Tasten (Schalter) mit EnableWindows(FALSE); ausschalte, sieht die Tastatur nicht mehr gut aus. Eigentlich will ich nur für die kurze Zeit unterbinden, daß durch einen Mausklick eine Nachricht ausgelöst wird, ohne daß der Nutzer optisch eine Veränderung der Bedienoberfläche wahrnimmt.

    Danke trotzdem für Deine Bemühungen...



  • Hm, 3 Sekunden die Eingabe in deiner Funktion, wo das alles ankommt, ignorieren?



  • ...ist warscheinlich von mir nicht gut erklärt, sorry. Es soll einfach für 3 Sekunden lang nicht möglich sein, mit der Maus irgend einen Schalter zu betätigen. Und es soll sich dabei optisch nichts am Dialog-fenster verändern...



  • Mach doch einen Timer und nimm eine bool Variable.

    Grüße Rapha



  • An Timer hab ich auch schon gedacht. Hab einen modalen Dialog hinzugefügt, der im Hintergrund abläuft, immer dann, wenn man auf eine Taste des virtuellen Klaviers klickt. Das funktioniert sogar ganz gut, den Dialog im Hintergrund sieht man nicht, und das Hauptfenster nimmt keine Mausnachrichten entgegen, da ja der Dialog im Hintergrund den Fokus hat. Eigentlich genial einfach, ABER: bei jedem Klick auf das (nicht aktive) Hauptfenster wird ein akustisches Signal ausgegeben (so ein bing), der leider stört, weil ja das Programm von der akustischen Ausgabe lebt. Wenn man die System-Signale ausstellen oder unterdrücken könnte...

    Trotzdem vielen Dank.



  • Achwas, denk doch nicht so kompliziert 😃
    Du erstellst eine bool Variable [z.B. bStopActions], die du am Anfang auf false setzt. Du überprüfst einfach in jeder Funktion, ob die Variable auf false gesetzt ist. Ist sie auf false gesetzt, wird die Funktion normal fortgesetzt. Ist sie dagegen auf true, wird die Funktion beendet (z.B. eine Funktion, die aufgerufen wird, wenn man auf einen Button klickt).
    Wenn du die Variable auf true setzst, ersell einen Timer, die sie nach 3 Sekunden wieder auf false setzt.
    z.B. so (in der Art):

    #define TIMER_DEACTIVATE_DIALOG 1
    
    bool CDeinDialog::DeaktivateDialogForSeconds(int nSekunden)
    {
      if(nSekunden <= 0) return false;
      // Statusvariable auf true setzten
      m_bStopActions = true;
      // Timer setzten
      SetTimer(TIMER_DEACTIVATE_DIALOG, nSekunden * 1000, NULL);
    }
    

    Nachrichten-Handler für WM_TIMER einfügen:

    void CDeinDialog::OnTimer(int nTimerID)
    {
      if(nTimerID == TIMER_DEACTIVATE_DIALOG)
      {
         m_bStopActions = false;
      }
      else CDialog::OnTimer(nTimerID);
    }
    

    Wenn der User jetzt z.B. auf den Button mit der ID IDC_ABSPIELEN klickt, machst du es so, wie ich es gesagt habe:

    void CDeinDialog::OnAbspielen()
    {
      if(m_bStopActions == true) return;
      // hier dein Code zum Was-Weis-Ich-Abspielen
    }
    

    Grüße Rapha



  • Oh cool, danke Ralph, das klingt sehr gut. Manchmal denkt man wirklich zu kompliziert. Ich kann's heute leider nicht mehr probieren, wird morgen gleich getestet. Ich danke Dir sehr, Erfolgsnachricht kommt...


Anmelden zum Antworten