Verständnisfrage zu Controls in OnInitDialog



  • Hallo!

    Ich habe diesen Quelltext in meinem Dialog:

    BOOL CNotizDlg::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
    
    	if (m_lVerfasserID != -1)
    	{
    		m_cbxVerfasser.EnableWindow(FALSE); // 1
     		GetDlgItem(IDC_EDT_NOTIZTEXT)->EnableWindow(FALSE); // 2
    		// TODO:
    		m_edtText.SetReadOnly(); // 3
    		CEdit* pEdit = dynamic_cast<CEdit*>(GetDlgItem(IDC_EDT_NOTIZTEXT)); // 4
    		ASSERT(pEdit);
    		if (pEdit)
    		{
    			pEdit->SetReadOnly();
    		}
    		UpdateData(FALSE);
    	}
    
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zurückgeben
    }
    

    Da treten jetzt aber "lustige" Phänomene auf:
    1: Funktioniert.
    2: Funktioniert.
    3: Funktioniert.
    4: pEdit ist NULL. Das ist aber das Edit, was in 3 funktioniert hat. 😕

    Klar, ich habe eine Lösung, aber kann mir das trotzdem bitte jemand erklären? Warum ist der Zeiger NULL sobald ich auf CEdit* caste?
    RTTI ist an und sonst funktionieren dynamic_casts ja auch.

    Danke 🙂



  • Vermutlich, weil GetDlgItem() einfach mal wirklich nur ein CWnd* zurückliefert. Demzufolge liegen für RTTI keine Informationen vor, um korrekt zu casten. Was passiert denn bei:

    CEdit* pEdit = dynamic_cast<CEdit*>((CWnd*)&m_cbxVerfasser);

    Das sollte doch dann funktionieren, oder?



  • Mit dem richtigen Typ funktioniert das, ja.

    Es funktioniert auch das hier:

    CComboBox* pcb = dynamic_cast<CComboBox*>(GetDlgItem(IDC_CBX_VERFASSER));
    

    Das "lustige" ist - hab ich grade rausgefunden - dass es nur funktioniert, wenn ich eine Membervariable dazu anlege.
    DANN funktioniert auch 4.

    Okay, die für die Combobox hab ich jetzt nicht gelöscht, nur die vom Edit...

    Kann das jemand erklären? 😕



  • Sag ich ja!

    CEdit* pEdit = dynamic_cast<CEdit*>((CWnd*)&m_cbxVerfasser);

    funktioniert, weil das CWnd* von m_cbxVerfasser die Typeinformation ja mitbekommt. GetDlgItem kapselt vermutlich die WinAPI - Funktion GetDlgItem und die liefert ein HWND und daraus kreiert er dann das CWnd - Object. -> ergo kann RTTI an der Stelle maximal erkenne, das es ein CWnd* - Object ist.

    So würde ich es mir zumindest erklären.

    oder besser:

    CWnd aWnd;
    aWnd.Attach( m_cbxVerfasser.m_hWnd );

    das CWnd weiß nicht, das es eigentlich eine Combobox ist 🙂


Anmelden zum Antworten