Dialog öffnet sich beim Beenden eines CPropertySheet Dialogs



  • Hi,
    ich habe ein MFC Dialog Projekt erstellt und zusätzliche Dialoge eingefügt um Reiter einzufügen. Ich würde gerne mein Programm sofort in einem Dialogfenster mir Reitern starten.

    Im OnInitDialog() habe ich folgendes hinzugefügt:

    CPropertySheet dlg(_T("Artikel Informationen"), this);
    
    CSheetMain Main;
    CSheetTab1 Tab1;
    
    dlg.AddPage(&Main);
    dlg.AddPage(&Tab1);
    
    dlg.DoModal();
    

    Wenn ich nun mein Programm ausführe, startet auch sofort der Dialog mit den Reitern.

    Leider öffnet sich beim beenden des Dialogs, noch einmal der "Default-Dialog".

    Wie kann ich das unterbinden, bzw. anders implementieren?

    Edit: Am besten wäre es wenn im Default-Dialog die Reiter implementiert werden. Mir viel nämlich gerade auf, dass im Reiter-Dialog auch die System-Menüs zum minimieren fehlen.

    Gruß, Taz



  • MyPropertySheet.h

    class CMyPropertySheet : public CPropertySheet
    {
    	DECLARE_DYNAMIC(CMyPropertySheet)
    
    public:
    	CMyPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
    	virtual ~CMyPropertySheet();
    
    protected:
    	DECLARE_MESSAGE_MAP()
    
    	virtual void PostNcDestroy();
    
    	CPage1		*m_pPage1;
    	CPage2		*m_pPage2;
    };
    

    MyPropertySheet.cpp

    IMPLEMENT_DYNAMIC(CMyPropertySheet, CPropertySheet)
    
    CMyPropertySheet::CMyPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
    	: CPropertySheet(pszCaption, pParentWnd, iSelectPage)
    	, m_pPage1( NULL )
    	, m_pPage2( NULL )
    {
    	m_pPage1 = new CPage1;
    	AddPage(m_pPage1);
    	m_pPage2 = new CPage2;
    	AddPage(m_pPage2);
    }
    
    void CMyPropertySheet::PostNcDestroy()
    {
    	CPropertySheet::PostNcDestroy();
    
    	for (int i = 0; i < GetPageCount(); i++)
    		delete GetPage(i);
    	delete this;
    }
    

    MyDialog.h

    CMyPropertySheet *m_pPropSheet;
    

    MyDialog.cpp
    in OnInitDialog():

    // hier wird das PropertySheet erzeugt
    	m_pPropSheet = new CMyPropertySheet( _T(""), this, 0 );
    	m_pPropSheet->Create( this, WS_CHILD | WS_VISIBLE, 0 );
    
    	m_pPropSheet->ModifyStyleEx( 0, WS_EX_CONTROLPARENT );
    	m_pPropSheet->ModifyStyle( 0, WS_TABSTOP );
    
    	// Größe an Dialogfenster anpassen
    	// IDC_PROPERTY_SHEET ist ein leeres CPictureControl
    	// mit der Größe musst du etwas experimentieren
    	CRect rcSheet;
    	GetDlgItem( IDC_PROPERTY_SHEET )->GetWindowRect( &rcSheet );
    	ScreenToClient( &rcSheet );
    	m_pPropSheet->SetWindowPos( NULL, rcSheet.left-7, rcSheet.top-7, 0, 0,
    		SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE );
    


  • Ist CPage1 eine neuer Dialog mit Klasse vom Basistyp CPropertyPage?

    Edit: Okay, ich habe es nun hinbekommen. Weiß auch nicht, wo der Fehler anfangs lag...

    Könntest du wenn diese Stelle noch einmal ein wenig erläutern?

    m_pPropSheet = new CMyPropertySheet( _T(""), this, 0 ); 
    m_pPropSheet->Create( this, WS_CHILD | WS_VISIBLE, 0 );
    

    Ich bin noch sehr neu in MFC.

    m_pPropSheet = new CMyPropertySheet(_T(""), this, 0);
    

    Es wird ein neues Objekt vom Typ CMyPropertySheet erstellt. Bei den Parametern bin ich mir nicht sicher. Beim ersten dachte ich, dass sich damit die Bezeichung des Tabs steuern lässt, das funktioniert aber nicht.

    m_pPropSheet->Create(this, WS_CHILD | WS_VISIBLE, 0)
    

    Hier wird der Dialog als "Kind" erstellt. Das Elternteil ist dann this (Ausgangsdialog) oder?

    Wird

    CMyPropertySheet::PostNcDestroy
    

    beim beenden des Dialogs aufgerufen?
    Könnte man es auch in den Destruktor packen?

    Gruß, Taz



  • class CPage1 : public CPropertyPage
    

    Tabtitel = Titel von CPropertyPage, z.B CPage1.

    Alle deine Fragen sollten von der Doku beantwortet werden:
    http://msdn.microsoft.com/en-us/library/491c89bk(v=vs.80).aspx
    http://msdn.microsoft.com/en-us/library/2zw820e5(v=VS.80).aspx
    http://msdn.microsoft.com/en-us/library/5zba4hah(v=vs.80).aspx


Anmelden zum Antworten