Nichtmodalen Dialog zerstören



  • Servus!

    Ich habe in einem dialogfeldorientierten Programm ein buttonförmiges Optionsfeld, welches einen nichtmodalen Dialog erzeugt, beim erneuten Klick wird es wieder geschlossen.

    So weit so gut.

    Komischerweise wird das Fenster plötzlich wieder geöffnet, wenn ich den modalen About-Dialog des Hauptfensters mit OK bestätige. 😕

    Der Code am Optionsfeld ist

    void CHauptDlg::OnKnopf() 
    {
    	if (m_bChildDlgIsActive)
    	{
    		m_ChildDlg.DestroyWindow();
    		delete m_ChildDlg;
    		m_bChildDlgIsActive = false;
    		m_cKnopf.SetCheck(0);
    	}
    	else
    	{
    		m_ChildDlg.Create(IDD_CHILD_DIALOG, this);
    		m_ChildDlg.m_ElternDialog = this;
    
    		m_ChildDlg.ShowWindow(SW_SHOW);
    		m_bChildDlgIsActive = true;	
    	}	
    }
    

    Was passiert da? Und was muss ich noch ergänzen, um den Dialog wirklich zuverlässig zu zerstören?

    Gruß, Thomas.



  • Wie sieht den deine MessageMap aus?



  • Ganz normal eigentlich.

    // Generierte Message-Map-Funktionen
    	//{{AFX_MSG(CHauptDlg)
    	virtual BOOL OnInitDialog();
    	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	afx_msg void OnDateiBeenden();
    	afx_msg void OnInfo();
    	afx_msg void OnDateiOeffnen();
    	afx_msg void OnDateiSpeichernunter();
    	afx_msg void OnDateiSpeichern();
    	afx_msg void OnDateiExportieren();
    	afx_msg void OnKnopf();
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    

    Das nichtmodale Dialogfeld ist übrigens eine Member-Variable, während der About-Dialog (OnInfo();) per lokaler Variable aufgerufen wird.

    Gruß, Thomas.



  • Und der Teil im cpp? 🙂

    Sonst setz mal mit F9 nen Breakpoint auf die Zeile

    m_ChildDlg.ShowWindow(SW_SHOW);
    

    und guck in der Aufrufliste (Callstack), von wo der da hinspringt.



  • auch ganz normal?

    BEGIN_MESSAGE_MAP(CHauptDlg, CDialog)
    	//{{AFX_MSG_MAP(CHauptDlg)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_COMMAND(ID_DATEI_BEENDEN, OnDateiBeenden)
    	ON_COMMAND(ID__INFO, OnInfo)
    	ON_COMMAND(ID_DATEI_OEFFNEN, OnDateiOeffnen)
    	ON_COMMAND(ID_DATEI_SPEICHERNUNTER, OnDateiSpeichernunter)
    	ON_COMMAND(ID_DATEI_SPEICHERN, OnDateiSpeichern)
    	ON_COMMAND(ID_DATEI_EXPORTIEREN, OnDateiExportieren)
    	ON_BN_CLICKED(IDC_Knopf, OnKnopf)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    


  • Die MessageMap sieht eigentlich ok aus.
    Hast du die OnOk() des AboutDlg überschrieben? Wenn ja, zeig mal den Code.
    Zeig außerdem mal die MessageMap des AboutDlg.



  • estartu_de schrieb:

    Sonst setz mal mit F9 nen Breakpoint auf die Zeile

    m_ChildDlg.ShowWindow(SW_SHOW);
    

    und guck in der Aufrufliste (Callstack), von wo der da hinspringt.

    Schon ausprobiert? 🙂



  • estartu_de schrieb:

    estartu_de schrieb:

    Sonst setz mal mit F9 nen Breakpoint auf die Zeile

    m_ChildDlg.ShowWindow(SW_SHOW);
    

    und guck in der Aufrufliste (Callstack), von wo der da hinspringt.

    Schon ausprobiert? 🙂

    Ja, hab ich probiert, aber ich steige bei der Aufrufliste nicht so richtig durch. 😕

    Habe die Optionsfelder durch CButtons ersetzt, komischerweise funktioniert es jetzt einwandfrei.
    An der AboutDLG Klasse habe ich nichts überschrieben.

    Der kleine Kompromiss ist jetzt, dass ich es noch nicht geschafft habe, den Button gedrückt darzustellen, solange das Fenster sichtbar ist. 😞


Anmelden zum Antworten