non modal window schließen



  • Ich erzeuge ein nicht modales Fenster. Nun möchte ich es wieder
    schließen... Mache ich das so richtig?

    #include "meinfenster.h"
    //...
    
    //im aufruf:
    meinfenster* m_pMyDlgPtr;
    
    if(anaus==1)
    {
    //fenster anzeigen
        m_pMyDlgPtr = new CMyDialog;
        m_pMyDlgPtr->Create(IDD_DIALOG3);
        m_pMyDlgPtr->ShowWindow(SW_SHOWNORMAL);
    }
    else if(anaus==0)
    {
    //fenster wieder schließen
    	m_pMyDlgPtr->DestroyWindow();
    
    }
    

    Ich meine, kann ich einfach DestroyWindow() so aufrufen, oder könnte mir
    das noch Probleme bereiten?



  • So sollte es eher funktionieren..

    wartefenster* m_pMyDlgPtr;
    m_pMyDlgPtr = new wartefenster;
    
    if(wanaus==1)
    {
    
        m_pMyDlgPtr->Create(IDD_DIALOG3);
        m_pMyDlgPtr->ShowWindow(SW_SHOWNORMAL);
    }
    else if(wanaus==0)
    {
    	m_pMyDlgPtr->DestroyWindow();
    
    }
    

    Wenn nun mein Hauptdialog (dialogbasierte Anw.) noch arbeitet und
    quasi gesperrt ist, wird dann offenbar auch mein nicht modaler Dialog
    mit eingefroren 👎 😮

    Ich möchte auch, dass der Hauptdialog nicht mehr manipuliert werden kann.
    Das stört mich also weniger, aber im nicht modalen wollte ich eigentlich
    sowas wie einen Hinweis über den Status bringen "Program is still working....".

    Evtl. noch mit einem Bild, das ich alle 2 Sekunden ändere.

    Kann mir jemand erklären warum der nicht modale ebenfalls nicht mehr brauchbar ist?

    Ich kann den ja schlecht in einen Thread packen, er soll ja nur 1x geöffnet werden. 😕



  • Das wäre eine Möglichkeit zum Schließen:

    HWND f=::FindWindow(NULL,"fenstername");
    
    ::SendMessage(f,WM_CLOSE,NULL,NULL);
    


  • Ich habe deine Idee mal aufgegriffen, da ich etwas ähnliches in einer
    Anwendung benötigen werde.

    Und zwar werden bei mir mehrere Laufwerke durchsucht. Das kann durchaus
    mal etwas länger dauern.

    Nun hab ich auch mal einen nicht modalen Dialog aufgerufen. Bei mir
    bleibt er ebenfalls, während das Hauptfenster noch arbeitet, inaktiv
    und wird nicht neu gezeichnet.

    Vielleicht kann jemand etwas zum Thema beitragen? Ein Thread in der
    Hauptanwendung wäre noch eine Idee. Man erzeugt erst das nicht modale Fenster
    und updatet es dann über den Thread der Hauptanwendung.

    Könnte doch funktionieren?!?



  • Ich glaube ich habe die Lösung, wenn es denn noch jemanden interessiert 🙄 Ist aber ungetestet...

    2 Threads im Hauptdialog anlegen. Der erste muss mit SendMessage
    immer wieder ein Ereignis im zweiten Dialog auslösen, das z.B.
    ein Bild im zweiten Dialog wechselt.

    Der zweite Thread im Hauptdialog muss die eigentliche Arbeit
    verrichten, die im Hauptdialog ausgeführt werden soll.
    Nun sollte man aber entweder den zweiten Dialog modal erzeugen, oder
    aber im hautpdialog die BUttons disablend, die nicht nochmals gedrückt
    werden dürfen, solange die Threads noch laufen.

    Ist der Thread der Hauptanwendung nun fertig, kann er den zweiten Thread
    ebenfalls beenden.


Anmelden zum Antworten