DoModal() friert Applikation ein



  • Grüß Euch,

    im Moment habe ich ein Problem und komme nicht weiter. Beim Aufruf eines Dialogs per DoModal() friert meine ganze Anwendung ein. So bin ich vorgegangen ...

    1. Dialog Ressource erstellt
    2. Klasse von CDialogEx abgeleitet
    3. die Ressourcen ID an den Konstruktor der Basisklasse weitergegeben

    IMPLEMENT_DYNAMIC(CDlgNewDlg, CDialogEx)
    //IMPLEMENT_DYNAMIC(CDlgNewDlg, CDialog)
    
    CDlgNewDlg::CDlgNewDlg(CWnd* pParent )
    	: CDialogEx(CDlgNewDlg::IDD, pParent)
    {
        // pParent ist an dieser Stelle NULL und sollte laut MSDN ja automatisch das
        // MainFrame von der Hauptapplikation bekommen. Hab ich inzwischen auch 
        // schon mal per AfxGetMainWnd() initialisiert.
    }
    

    4. beim öffnen eines neuen dokumentes ( OnNewDocument() ) sende ich einen Message per PostMessage(..) an mein Mainframe Fenster um diesen Dialog per DoModal() anzuzeigen und beende OnNewDocument() mit false. ( Ich will halt, dass der Benutzer beim neuen Anlegen eines Dokumentes, erst ein mal ein paar Grundeinstellungen per Dialog vornimmt und erst dann ein neues Document öffnen kann ).

    5. Ich habe die virtuellen Methoden OnInitDialog() und OnPaint() überschrieben und rufe darin die Basisklassenmethoden auf, wobei mir OnInitDialog() ein TRUE zurückliefert ( wie bereits gesagt ... der Dialog wird auch angezeigt ).

    6. Daraufhin habe ich einen CFileDialog per DoModal in dem Eventhanlder geöffnet und der funktioniert einwandfrei. Daraus schliesse ich mal, dass es an meiner Dialog Klasse liegen muss.

    ...

    Als Resultat wird mir der Dialog angezeigt, aber die gesamte Applikation ist eingefroren, d.h. es kommt dieser widerliche *Ping* Sound. Beim googeln habe ich gelesen, dass man Spy++ anschmeissen kann, um zu sehen wo die WindowsMessages ankommen. Die landen anscheinend bei meiner Hauptapplikation und nicht im Dialog. Da ich wegen dem funktionierenden FileDlg vermute, dass es an meiner Dialog-Klasse liegt ... hier mal meine Dialog-Klasse ...

    Header:

    #pragma once
    #include "afxcmn.h"
    #include "afxwin.h"
    
    //
    // CardLib includes
    //
    #include "..\CardLib\DeviceContainer.h"
    
    // CDlgNewDlg dialog
    
    class CDlgNewDlg: public CDialogEx
    {
    // Dialog Data
    	enum { IDD = IDD_DLG_NEW };
    
    	DECLARE_DYNAMIC(CDlgNewDlg)
    
    public:
    	CDlgNew(CWnd* pParent = NULL);   // standard constructor
    	virtual ~CDlgNewDlg();
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    
    	DECLARE_MESSAGE_MAP()
    public:
        afx_msg BOOL OnInitDialog();
        afx_msg void OnPaint();
    };
    

    Implementierung:

    // CDlgNewDlg.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "CardSetup2008.h"
    #include "DlgNewDeviceConfig.h"
    
    // CDlgNewDlgdialog
    
    IMPLEMENT_DYNAMIC(CDlgNewDlg, CDialogEx)
    //IMPLEMENT_DYNAMIC(CDlgNewDlg, CDialog)
    
    CDlgNewDeviceConfig::CDlgNewDlg(CWnd* pParent /*=NULL*/)
    	: CDialogEx(CDlgNewDlg::IDD, pParent)
    
    {
    }
    
    CDlgNewDlg::~CDlgNewDlg()
    {
    }
    
    void CDlgNewDlg::DoDataExchange(CDataExchange* pDX)
    {
        __super::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CDlgNewDlg, CDialog)
        ON_WM_PAINT()
    END_MESSAGE_MAP()
    
    // CDlgNewDlg message handlers
    
    BOOL CDlgNewDlg::OnInitDialog()
    {
        BOOL bRet = __super::OnInitDialog();
        // liefert hier TRUE zurück
    
        //((CEdit*)GetDlgItem(IDC_EDIT_FIELD))->SetFocus;
        // Hier müsste schon ein Fehler geschehen, da SetFocus() bereits eine 0 
        // zurückliefert. GetDlgItem() liefert anscheinend aber noch einen gültigen
        // Pointer auf mein IDC_EDIT_FIELD control.
    
        return bRet;
    }
    
    void CDlgNewDeviceConfig::OnPaint()
    {
        __super::OnPaint();
    }
    

    btw. Wenn ich in OnPaint() einen Debug Punkt setze wird dieser die ganze Zeit aufgerufen, da ich ja immer zwischen meiner App und dem VS hin und her springe ... demnach müsste das mit dem Weiterleiten der Messages an den Dialog ja eigentlich funktionieren, oder?!?

    Naja ... ich komme auf jedenfall nicht weiter und wäre froh, wenn mir jemand von Euch einen Tip geben könnte, was ich falsch mache oder wo ich mal nachschauen soll.

    Gruß
    Arrghh



  • btw ...
    dort wo "CDlgNewDeviceConfig" steht sollte eigentlich "CDlgNewDlg" stehen. Ich wollte das ganze nur kürzer und übersichtlicher machen.


  • Mod

    Wenn Du einen modalen Dialog öffnest mit DoModal, dann ist dies das normale Verhalten. Das bisherige Main Window wird disabled.

    Wenn Du eine MDI APplikation hast, dann setze CCommandLineInfo::m_nShellCommand auf FileNothing!



  • hallo,

    ich habe meinen Fehler gerade gefunden. So wie es aussieht habe ich wohl bei den Ressourcen ein falsches Style-Flag für den Dialog gesetzt. Sobald ich die Zeile des About-Dialogs kopiert hatte, ging es. Ich guck jetzt mal in der MSDN nach, was ich denn da genau gemacht hatte ... tsts.

    @Martin
    ja es ist eine MDI-Applikation ... und danke für den Tip 😉


Anmelden zum Antworten