Nicht-modalen Dialog mittels OnLButtonDblClk() auslösen

Cappaja

Erfahrenes Mitglied
hallo,

ich habe einen nicht-modalen dialog nach folgender anleitung gemacht: Link

der dialog wird im debug modus zumindest ausgeführt, stürzt aber beim beenden, sprich senden eines IDOK oder IDCANCEL ab. nach erstellen im release mode stürzt das programm schon beim doppelklick event ab.

Nicht-modale klasse CDisplayControl.h
Code:
private:
	CWnd* m_pParent;
	UINT m_wCloseMsg;
public:
	CDisplayControl(CWnd* pParent = NULL);   // Standardkonstruktor
	static const char* GetMsgString();
Nicht-modale klasse CDisplayControl.cpp
Code:
CDisplayControl::CDisplayControl(CWnd* pParent /*=NULL*/)
	: CDialog(CDisplayControl::IDD, pParent)
{
	m_pParent = pParent;
	// WINDOWS-Nachricht registrieren
    m_wCloseMsg = ::RegisterWindowMessage(GetMsgString());
}

const char* CDisplayControl::GetMsgString()
{
	 return "CloseNonModalDlg";
}

void CDisplayControl::OnOK() 
{
    m_pParent->SendMessage(m_wCloseMsg, IDOK, NULL);
	CDialog::OnOK();
}

Hauptklasse CWiwoDlg.h
Code:
private:
	CDisplayControl* m_pDisplayControl;
	static UINT m_wCloseMsg;
protected:
        afx_msg long OnNonModClosed(UINT wReason, LONG lParam);
Hauptklasse CWiwoDlg.cpp
Code:
// Nachricht für Datenaustausch mit nicht-modalem Dialog registrieren
UINT CWiwoDlg::m_wCloseMsg = RegisterWindowMessage(CDisplayControl::GetMsgString());

BEGIN_MESSAGE_MAP(CWiwoDlg, CDialog)
	ON_REGISTERED_MESSAGE(m_wCloseMsg, OnNonModClosed)
END_MESSAGE_MAP()

CWiwoDlg::CWiwoDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CWiwoDlg::IDD, pParent)
{
	m_pDisplayControl = NULL;
}

CWiwoDlg::~CWiwoDlg()
{
	delete m_pDisplayControl;
}

void CWiwoDlg::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	CRect rect = m_pGraph->CalcDataArea();
	BOOL bFlag = CheckRect(point, rect);

	if(bFlag == TRUE)
	{
		// Falls Dialog noch nicht erstellt ist
		if (m_pDisplayControl == NULL)
		{
			// Dialog-Objekt erstellen
			m_pDisplayControl = new CDisplayControl(this);
			// Dialog erstellen und anzeigen
			m_pDisplayControl->Create(CDisplayControl::IDD);
			m_pDisplayControl->ShowWindow(SW_NORMAL);
		}
	}	
	
	CDialog::OnLButtonDblClk(nFlags, point);
}

LONG CWiwoDlg::OnNonModClosed(UINT wReason, LONG lParam)
{
	// Dialog zerstören
	m_pDisplayControl->DestroyWindow();
	
	// und Dialog-Objekt löschen
	delete m_pDisplayControl;
	m_pDisplayControl = NULL;
	
	return 0L;
}

anstelle der registrierten windows message bei OnOK() habe ich auch versucht einfach nur die Methode DestroyWindow() aufzurufen, doch auch das hat nichts gebracht. liegt das vielleicht an meinem aufruf in der doppelklick methode für die linke maustaste? das dürfte doch eigentlich kein problem sein oder doch?
 
Zuletzt bearbeitet:

Endurion

Erfahrenes Mitglied
Da du SendMessage mit deiner Close-Nachricht aufrufst, geht das direkt an dein Hauptfenster. Da drin zerstörst du den Dialog und löschst die Dialog-Instanz. Danach kehrt SendMessage zurück und du rufst noch CDialog::OnOK auf, obwohl es dich eigentlich nicht mehr gibt. Böses Karma!

Mach mal ein PostMessage statt SendMessage, das sollte dann ausreichen.
 

Cappaja

Erfahrenes Mitglied
hey endurion,

vielen dank. jetzt läuft alles ohne probleme. ich kannte ehrlich gesagt bis dato noch nicht den unterschied von send und postmessage. das war auf jedenfall sehr hilfreich danke!

gruß cappaja
 

Neue Beiträge