CDialog nicht modal



  • Hi,

    vorweg möchte ich nur kurz erwähnen dass ich die Suche verwendet habe und leider nichts passendes gefunden habe.

    Ich habe eine DLL die einen Dialog öffnet, dieser Dialog sollte jedoch nicht modal geöffnet werden. Also bin ich wie folgt vorgegangen:

    Ich hab folgende Methoden überschrieben

    void CMainDlg::OnCancel()
    {
    	DestroyWindow();
    }
    
    void CMainDlg::PostNcDestroy()
    {
    	delete this;
    }
    

    und zeige das Fenster mit den folgendem Code an:

    CMainDlg* pMainDlg = new CMainDlg(NULL);
    pMainDlg->Create(IDD_DIALOG1);
    pMainDlg->ShowWindow(SW_SHOW);
    

    Diese Vorgehensweise funktioniert auch schon fast, d. h. das Fenster wird nicht modal angezeigt, aber es reagiert nicht auf das drücken der Tab-Taste. Was ein Problem ist, weil sich die Anwendung dann nicht mehr mit der Tastatur bedienen lässt.

    Des Weiteren funktioniert mein bisheriger Code nicht mehr, damit das Fenster nur max. 1x angezeigt werden kann.

    if(bShow)
    {
      bShow = false;
      CMainDlg* pMainDlg = new CMainDlg(NULL, theApp.m_pHardwareManager);
      pMainDlg->DoModal();
      bShow = true;
    }
    

    Danke und viele Grüße
    Kerberos



  • kerberos schrieb:

    Des Weiteren funktioniert mein bisheriger Code nicht mehr, damit das Fenster nur max. 1x angezeigt werden kann.

    if(bShow)
    {
      bShow = false;
      CMainDlg* pMainDlg = new CMainDlg(NULL, theApp.m_pHardwareManager);
      pMainDlg->DoModal();
      bShow = true;
    }
    

    Bei einem modalen Dialog kannst du dir doch solche Mechanismen sparen, da an der Code-Stelle gewartet wird, bis der Dialog beendet wird. Wenn du deinen Dialog nun per ShowWindow aufrufst, bringt deiner Vorgehensweise recht wenig, da du bShow immer nach Aufrufen des Dialogs auf true setzt, so dass bei jedem neuen Versuch "if(bShow)" zutrifft und der Dialog nochmal erzeugt wird. Die ganzen bShow-Geschichten hättest du dir also direkt sparen können. 😉

    Dein nichtmodaler Dialog muss selbst seinen Status zurücksetzen. Wenn du den Dialog erzeugst, setzt du bShow auf false, und der Dialog selbst muss bShow beim Beenden auf true setzen.



  • Hi _matze

    Danke für deine Antwort!

    Das ist mir schon klar, dass bei DoModal() gewartet wird bis der Dialog beendet wird. Darum funktioniert mein Code ja auch nicht mehr.

    Ich dachte nur dass es evtl. eine Möglichkeit gibt nach ShowWindow zu warten, dann müsste ich meinen Code nicht umbauen.

    Ist aber auch kein Problem... ich übergebe einfach eine Referenz auf die Klasse die mir den Dialog öffet und ändere in der OnCancel des Dialoges den Staus des Flags um.

    Das mit dem Tab bereitet mir wesentlich größere Sorgen.

    Lg Kerberos



  • kerberos schrieb:

    Ich dachte nur dass es evtl. eine Möglichkeit gibt nach ShowWindow zu warten, dann müsste ich meinen Code nicht umbauen.

    DoModal? 😃 😉

    Zu deinem Tab-Problem kann ich leider nichts sagen...



  • kerberos schrieb:

    Ich dachte nur dass es evtl. eine Möglichkeit gibt nach ShowWindow zu warten, dann müsste ich meinen Code nicht umbauen.

    DoModal?

    Du hast recht, war eine dumme idee von mir 🙄 .



  • Hi,

    ich habe darurch dass ich die Dialog nicht mehr modal anzeige noch weitere Probleme:

    1. Problem

    Wenn ich mit meinem Hauptfenster (CDialog / nicht modal) ein weiteren Dialog (CDialog / nicht modal) erstelle und anzeige, dann kann ich zwar beide Dialoge bedienen, aber der neu erstellte Dialog lieg immer über dem Hauptfenster (z-Achse) egal welches Fenster den Fokus hat.

    Wenn ich jetzt vom irgendeinem anderen Fenster den Fokus auf den Dialog wechsle, dann kommt das Hauptfenster auch in den Fordergrund (in z-richtung über die Anwendung die zuvor den fokus hatte). Also irgendwie gehören die Fenster noch zusammen, obwohl ich das nicht möchte.

    2. Problem

    Der Dialog dem im Hauptfenster erstellt und angezeigt wird besteht aus mehreren Buttons und einer Zeichnung die ich in der OnPaint-Methode erstelle.

    Wenn ich diesen Dialog auf meinen zweiten Monitor (Erweiterungsmonitor) schiebe und das Hauptfenster auf dem ersten Monitor lasse und dann den Fokus auf ein anderes Fentser wechsel dann verschieben sich die Buttons auf dem Dialog und die Zeichnung wird weiterhin angezeigt richitg angezeigt.

    Am einfachsten wäre es, wenn ich beim Fokuswechsel das aktuelle Fenster "einfrieren" könnte und wenn es wieder den Fokus bekomme wieder "entfrieren" kann.

    Vielen Dank!
    Lg Kerberos



  • kerberos schrieb:

    Wenn ich mit meinem Hauptfenster (CDialog / nicht modal) ein weiteren Dialog (CDialog / nicht modal) erstelle und anzeige, dann kann ich zwar beide Dialoge bedienen, aber der neu erstellte Dialog lieg immer über dem Hauptfenster (z-Achse) egal welches Fenster den Fokus hat.

    Hast du den Dialog auf topmost gesetzt? Vermutlich, deaktivier das mal.



  • Hi Matze,

    danke für deine Antwort!

    Beide Fenster (Hauptfenster + Dialog) sind Topmost=False.Zumindest steht das im Gui-Editor in den Eigenschaften.
    Lg Kerberos



  • Hi,

    kann mir niemand einen Tipp geben, ich hänge echt fest. Google hilft mir nicht weiter und ich find auch nicht den richtigen Ansatz👎

    2. Problem hab ich jetzt gelöst, war ein Programmierfehler.

    Zu den Einstellungen meiner Dialoge:
    Appearance:
    - Border: Resizing
    - Clip Children: False
    - Layered: False
    - Overlapped Window: False
    - Palette Window: False
    - Style: Popup
    - Topmost: False
    - Titlebar: True
    - Rest alle False

    Behavior:
    - Application Window: True
    - Visible: True
    - Rest alle False

    Misc:
    - Alles: False

    Bin für jede Hilfe Dankbar.

    Viele Grüße
    Kerberos



  • Hallo,

    Seltsamer Weise funktioniert die Tab-Taste, wenn ich den Code in einer Exe-Datei ausführe, der gleiche Code funktioniert nicht, wenn ich ihn in eine DLL stecke und diese mit einer anderen Exe aufrufe 😕

    Nachdem ich jetzt schon drei Tage lang versucht habe das Problem zu lösen, habe ich mal n bisschen in die Win32-Api eingelsen und etwas mehr oder weniger interessantes gefunden:

    http://msdn.microsoft.com/en-us/library/ms644994(VS.85).aspx#styles

    Im Abschnitt "Modeless Dialog Boxes" sind genau meine Probleme aufgeführt.

    The application is responsible for retrieving and dispatching input messages to the dialog box. Most applications use the main message loop for this. To permit the user to move to and select controls by using the keyboard, however, the application must call the IsDialogMessage function. For more information about this function, see Dialog Box Keyboard Interface.

    A modeless dialog box neither disables the owner window nor sends messages to it. When creating the dialog box, the system makes it the active window, but the user or the application can change the active window at any time. If the dialog box does become inactive, it remains above the owner window in the Z order, even if the owner window is active.

    Hilfe?!
    Lg Kerberos



  • Hab das mit den Steuerungstasten (Tab, Pfeiltasten, etc) hinbekommen. Falls jemand mal das gleiche Problem haben sollte -> Ich hab einfach eine neue Message-Hook erzeugt und die Messages schon dort gefiltert.

    Lg Kerberos


Anmelden zum Antworten