EnableWindow Frage



  • Hallo Zusammen,

    Ich habe eine Frage im Bezug auf der EnableWindow(bool wert) Methode. Meine
    Dialog besitzt eine Checkbox und eine ComboBox element.
    Die Checkbox element ist vom Typ Value und ComboBox ist vom Control.

    Ich moechte die ComboBox ueber den Checkbox de/aktivieren. Bei der
    Initializierung ist der Checkbox "m_funky" leer und Combobox "m_combo" aktiv.
    Die Code dazu:

    void OutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
            //...
    	DDX_Check(pDX, IDC_FUNKY, m_funky);
    	//...
    }
    //..
    BEGIN_MESSAGE_MAP(OutDlg, CDialog)
    	//..
    	ON_BN_CLICKED(IDC_FUNKY, &OutDlg::OnBnClickedFunky)
    	//..
    END_MESSAGE_MAP()
    //..
    void OutDlg::OnBnClickedFunky()
    {
    	// TODO: Add your control notification handler code here
    	//_cprintf("%s@%s> check box value is:%d",__FUNCTION__,__LINE__,m_funky);
    	if(m_funky==FALSE)
    		m_combo.EnableWindow(FALSE);
    	else
    		m_combo.EnableWindow(TRUE);
    }
    

    Wenn ich an dem Checkbox clicke, die ComboBox wird deaktiviert, wunderbar. Um
    danach die Combobox zu aktivieren, clicke ich wieder an den Checkbox. Passiert
    aber nichts, die combobox wird nicht aktiviert. Praktisch:
    m_combo.EnableWindow(TRUE) wird nicht ausgefuehrt.

    Warum reagiert die Combobox nicht mehr? Das Ereignishandler muesste fuer
    Checkbox in beiden Zustaenden(clicked/nicht clicked) dasselbe sein, oder? Muss
    ich nach EnableWindow(TRUE) irgendwas updaten?

    Eine andere Sache die ich nicht verstehe ist, wenn ich einen _cprintf innerhalb
    von einer Handler machen moechte, kriege ich einen "Access violation reading
    location"(siehe auskommentierte _cprintf).Woran kann es liegen?

    Danke im voraus,



  • Mach davor mal UpdateData.
    Und wieso sparst du dir nicht die if und machst

    m_combo.EnableWindow(m_funky);
    

    😕



  • Hallo estartu,

    danke fuer die prompte Antwort!

    estartu schrieb:

    Mach davor mal UpdateData.

    Super, klappt wunderbar jetzt.. So `UpdateData` immer vor dem Verlassen
    des jeweiligen Handlers, oder?

    Jetzt Antwort auf meiner eigenen Frage 😉 :

    jsbach schrieb:

    ...wenn ich einen _cprintf innerhalb
    von einer Handler machen moechte, kriege ich einen "Access violation reading
    location"(siehe auskommentierte _cprintf).Woran kann es liegen?

    Das Problem lag in der Formatierung der Ausgabe! Richtig ist:

    _cprintf("%s@%d> check box value is:%d",__FUNCTION__,__LINE__,m_funky);
    

    Gruss,



  • jsbach schrieb:

    So `UpdateData` immer vor dem Verlassen
    des jeweiligen Handlers, oder?

    UpdateData machst du immer da, wo du es brauchst. Du brauchtest den Wert einer Variablen aus dem Dialog, dann machst du vorher UpdateData(TRUE) wenn du eine Variable in der Funktion veränderst musst du noch UpdateData(FALSE) machen damit es auch angezeigt wird.


  • Mod

    In solchen Fällen verwende ich niemals UpdateData! Das lädt alle Variablen um! Warum muss ich das tun, wenn ich einfach mit m_myButton.GetCheck() prüfen kann ob dieser Button nun angeklickt ist oder nicht.
    UpdateData hat mir bei komplexen Dialogen einfach viel zu viele Seiteneffekte.


Anmelden zum Antworten