Problem mit SW_SHOW



  • Hallo

    ich habe eine Methode programmiert, die mir ein Element ein- bzw. ausblendet.

    void MyClass::hide(){
      m_Label.ShowWindow(SW_HIDE);
     }
     void MyClass::hide(){
      m_Label.ShowWindow(SW_HIDE);
     }
    

    Beim OnInit() wird hide() aufgerufen, so dass man das CStatic control Element nicht sieht.

    Klicke ich auf einen Button, so will ich das ding anzeigen lassen (show()).

    okay. so weit so gut

    void MyClass::OnButtonClick(){
       // call a method
       bool bOk = proccess()
       if(!bOK){
        AfxMessageBox("failed");
       }
     }
    
     bool MyClass::proccess(){
      // jetzt anzeigen
      show();
      Sleep(2000);
    
      bool bok = // do something
    
      return bok;
     }
    

    Das Problem ist, dass wenn ich 2sek in der Methode 'proccess()' warte, dass eigentlich schon VORHER das entsprechende Element mit 'show' hätte gezeichnet werden müssen. Tut es allerdings nicht.
    Wenn dann in der Methode weitere sachen abgearbeitet werden und aufgrund eines 'false' die MessageBox ausgegeben wird. DANN erscheint das Element... Der Dialog wurde angeblich neu gezeichnet - ich finde aber die Passende Methode nicht, welche ich unmittelbar nach 'show()' aufrufen könnte und in der FAQ konnte ich mit meinen Stichworten auch nix finden.

    Wer kann helfen?



  • Weil während des Sleep Aufrufs keine Nachrichten verarbeitet werden.



  • sleeper4 schrieb:

    Weil während des Sleep Aufrufs keine Nachrichten verarbeitet werden.

    und das bedeutet?
    ist ja egal ob Sleep(1000) steht oder ein anderer Methodenaufruf abgearbeitet wird. die 'show()' Methode wird ja zuerst abgearbeitet. Strange thing.



  • Ne überhaupt nicht strange. Du kannst die UpdateWindow Memberfunktion benutzen nach dem show() Aufruf.



  • sleeper4 schrieb:

    Ne überhaupt nicht strange. Du kannst die UpdateWindow Memberfunktion benutzen nach dem show() Aufruf.

    ahh das funktionierte. Danke vielmals!



  • Deine Methode wird zuerst aufgerufen. Der Code darin wird auch ausgeführt. Dieser Code sendet aber nur eine Nachricht an Windows den Buttonstatus zu ändern.
    Windows empfängt diese Nachricht. Während Windows diese Nachricht verarbeitet läuft dein Programm bei Sleep weiter. Jetzt hat Windows auch die Nachricht verarbeitet und festgestellt das du darin einen Button deiner Applikation aktivieren willst und sendet an diesen Button eine Nachricht. (Stellt es in die Warteschlange wo es die Preogramme normalerweise abholen) Da aber dein Programm im Spleep ist wird die Nachricht nicht abgeholt.



  • Hier wird nur das Problem sein das kein WM_PAINT Event erzeugt wird, weil die Nachrichtenschleife natürlich während des Schlafens nicht ausgeführt wird. Das EnableWindow wirkt sofort, nur das Fenster wird noch nicht neugezeichnet.


Anmelden zum Antworten