ERLEDIGT
JA
JA
ANTWORTEN
2
2
ZUGRIFFE
494
494
EMPFEHLEN
-
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
Nicht-modale klasse CDisplayControl.cppCode :1 2 3 4 5 6
private: CWnd* m_pParent; UINT m_wCloseMsg; public: CDisplayControl(CWnd* pParent = NULL); // Standardkonstruktor static const char* GetMsgString();
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
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
Hauptklasse CWiwoDlg.cppCode :1 2 3 4 5
private: CDisplayControl* m_pDisplayControl; static UINT m_wCloseMsg; protected: afx_msg long OnNonModClosed(UINT wReason, LONG lParam);
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
// 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?Geändert von Cappaja (15.07.09 um 17:06 Uhr)
-
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.
-
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
Ähnliche Themen
-
modalen Dialog im Vordergrund anzeigen
Von sinamine im Forum .NET Windows FormsAntworten: 7Letzter Beitrag: 25.03.08, 14:45 -
Zugriff auf modalen Dialog
Von jb007 im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 1Letzter Beitrag: 14.05.07, 21:26 -
Schriftart im Modalen Dialog ändern?
Von Apollo75 im Forum VisualStudio & MFCAntworten: 6Letzter Beitrag: 05.06.06, 10:35 -
Nachricht von einem Dialog zu modalen, geöffneten 2. Dialog schicken
Von gehrti im Forum VisualStudio & MFCAntworten: 5Letzter Beitrag: 24.05.05, 12:49 -
Statusleiste für modalen Dialog als Hauptfenster
Von sdi im Forum VisualStudio & MFCAntworten: 1Letzter Beitrag: 02.11.04, 13:40





Zitieren
Login






