Wie ändere ich den Maindialog



  • Hallo,

    in Fortsetzung der Dialogvererbung bleibt mir noch das Problem,
    Wie ändere schaffe ich es, beim Start meines Programmes einen anderen Dialog aus einer anderen resource anzuzeigen als bisher?

    Muss ich da evt. in OnPaint etwas überschreiben?



  • Wenn ich mich nicht irre, dann guck dir mal die InitInstance von CMeinDialogfeldbasiertesProgramm.cpp an. Das sollte das in etwa so aussehen:

    CMeinDialogfeldbasiertesProgrammDlg dlg;
    	m_pMainWnd = &dlg;
    	INT_PTR nResponse = dlg.DoModal();
    	if (nResponse == IDOK) //[...]
    


  • das hatte ich bereits getan, zeigt aber trotzdem den anderen Dialog 😡



  • Hast Du den alten Dialog vielleicht nur kopiert und vergessen, den IDD-Bezeichner in der Headerdatei anzupassen?


  • Mod

    Im Konstruktor, Deines Basis Dialoges wird ein enum IDD Wert gesetzt. Du musst natürlich die Basisklasse so anpassen, das auch die abgeleitete Klasse einen Dialog ID Wert übereben kann.



  • Nein, die IDD wurde unter Eigenschaften geändert, im header sogar automatisch vom Studio.
    Jetzt wird's noch komischer, ich erhalte Zugriffsverletzung, sobald ich auf eine Methode er Combobox zugreife...
    Bin zwischenzeitlich im Zweifel, ob das mit der Vererbung zweier Dialoge tatsächlich funktioniert, wäre schön wenn jemand ein Beispiel hätte.

    @Martin: wie genau meinst du das mit IDD vererben?
    Der Konstruktor der Basisklasse erbt standardmäßig den Konstruktor von CDialog mit, letzerer ist mit CBasisdialog::IDD aufgerufen... ?!?



  • Ich hab mir einen BasisDlg gemacht. Der hat aber selber keine Ressource. Magst du trotzdem mehr wissen?



  • Hallo estartu,

    danke für das Angebot, geht aber leider etwas an der Idee vorbei, Dialoge zu vererben.
    Interessant wäre für mich, wie Martin das meint mit der IDD vererben, vielleicht liegt ja da die Wurzel der Übels.
    BTW generelle Frage, muss eine Basisklasse immer virtuell sein? Liegt vielleicht da mein Denkfehler?


  • Mod

    Bei mir nimmt die Basisklasse im Konstrukur eine ID auf, die es an den CDialog Konstruktor dann weitergibt. Das meine ich mit vererben.

    Schau Dir mal Deinen Basis-Dialog an, der hat einen Kosntruktor in dem die enum Variable IDD weitergegeben wird an CDialog!



  • Ah-jetzt ja (eine Insel) 😉
    Man bohrt den Aufruf Basiskonstruktur einfach die ID auf und übergibt sie als Wert.
    Ich stelle morgen mal etwas Quellcode, vllt. ist das ja doch ein Fall für die FAQ.

    Thanks an alle 👍



  • Hier noch die Lösung:

    Der Basiskonstruktor muss die IDD des Fensters weiterverarbeiten können,oder eben in der Deklaration der Basisheaderdatei die eigene IDD als Defaultwert übergeben werden.

    // Header-Konstruktordeklaration in derBasisklasse
    	CBasisDlg(CWnd* pParent = NULL, int ID = IDD);	// Standard-Konstruktor
    
    CBasisDlg::CBasisDlg(CWnd* pParent /*=NULL*/, int ID )
    : CDialog(ID, pParent)
    {
    // blabla
    
    }
    

    entsprechen muss dieser Konstruktor auch von der vererbten Klasse aufgerufen werden.

    // Abgeleiteter Dialog-Konstruktor:
    
    CMultiTestDlg::CMultiTestDlg(CWnd* pParent /*=NULL*/)
    :CTestcenterDlg(pParent, CMultiTestDlg::IDD)
    {
    blahh
    }
    

    Alle ID's der gemeinsamen Steuerelemente müssen gleich bezeichnet und die gleichen Konstanten besitzen.

    so, hoffe es hilft evt auch anderen weiter


Anmelden zum Antworten