tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
2
ZUGRIFFE
494
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Cappaja Cappaja ist offline Mitglied Silber
    Registriert seit
    May 2009
    Ort
    Konstanz
    Beiträge
    85
    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 :
    1
    2
    3
    4
    5
    6
    
    private:
        CWnd* m_pParent;
        UINT m_wCloseMsg;
    public:
        CDisplayControl(CWnd* pParent = NULL);   // Standardkonstruktor
        static const char* GetMsgString();
    Nicht-modale klasse CDisplayControl.cpp
    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
    Code :
    1
    2
    3
    4
    5
    
    private:
        CDisplayControl* m_pDisplayControl;
        static UINT m_wCloseMsg;
    protected:
            afx_msg long OnNonModClosed(UINT wReason, LONG lParam);
    Hauptklasse CWiwoDlg.cpp
    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)
     

  2. #2
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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.
     

  3. #3
    Cappaja Cappaja ist offline Mitglied Silber
    Registriert seit
    May 2009
    Ort
    Konstanz
    Beiträge
    85
    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

  1. modalen Dialog im Vordergrund anzeigen
    Von sinamine im Forum .NET Windows Forms
    Antworten: 7
    Letzter Beitrag: 25.03.08, 14:45
  2. Zugriff auf modalen Dialog
    Von jb007 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 14.05.07, 21:26
  3. Schriftart im Modalen Dialog ändern?
    Von Apollo75 im Forum VisualStudio & MFC
    Antworten: 6
    Letzter Beitrag: 05.06.06, 10:35
  4. Antworten: 5
    Letzter Beitrag: 24.05.05, 12:49
  5. Statusleiste für modalen Dialog als Hauptfenster
    Von sdi im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 02.11.04, 13:40