Dialog Controls aktivieren / deaktivieren



  • Hallo,

    ich habe mit viel Mühe einen Dialog erstellt, welcher mir als Kontrollpanel dient. Ich habe verschiedene Elemente (Checkboxen, Slider, Button, ...), welche je nach Bedarf aktiviert bzw. deaktiviert werden.

    Wie schaffe ich das? Ich habe schon Membervariablen für die einzelnen Controls.



  • EnableWindow



  • GetDlgItem(IDC_DEINES_BUTTON)->EnableWindow(FALSE ODER TRUE)



  • Ohweh,

    eigentlich klappt es ja. Ich habe im Headerfile die Variablen Hinzugefügt (z.B. CSliderCtrl *pSliderX;). Ich habe in einer init-Methode die Variablen initialisiert (pSliderX = (CSliderCtrl*) GetDlgItem(IDC_SLIDERX);) und habe in dieser Methode auch schon Parameter eingestellt.

    Wieso klappt es nicht, wenn ich das gleiche (z.B. ..->SetPos(..)) in einem EventHandler der gleichen Klasse versuche????? Ich bekomme einen nicht erlaubten Speicherzugriff und Absturtz.

    Nachmal der Code in Auschnitten:

    //MyControlPanel.h:
    ...
    private:
        CSliderCtrl *pSliderX;
    ...
    
    //MyControlPanel.cpp:
    
    ... 
    void MyControlPanel::initItems(){
    ...
        pSliderX = (CSliderCtrl*) GetDlgItem(IDC_SLIDER1);
        pSliderX->SetRange(-10, 10, TRUE);
        pSliderX->SetPos(0);
    ...
    }
    
    ...
    //falls ein resetButton gedrückt wurde:
    void MyControlPanel::OnBnClickedResetX(){
        pSliderX->SetPos(0);
    }
    


  • Geh mal mit dem debugger rein und vergewissere dich, dass der pointer tatsächlich auf das control zeigt... wenn dies nicht der fall ist musst du die stelle überarbeiten an der du den pointer auf das control holst. möglicherweise zu einem späteren zeitpunkt... schreib mal, wann du inititems aufrufst. die lösung ist wahrscheinlich einfacher als du denkst...



  • Ja, das nehme ich an, dass die Lösung super simpel ist. Die ganze Sache geht ja auch, wenn ich im Eventhandler GetDlgItems(..)->SetPos() benutze. Hab halt noch nicht wirklich viel Erfahrung in Cpp, fange gerade erst an.

    Also, ich rufe initItems im Konstruktor auf. Dieser wird in der Initialisierungmethode des MainFrames (nachdem dieser gezeigt wurde) aufgerufen:

    [cpp]
    MyControlPanel::MyControlPanel(CWnd* pParent /=NULL/)
    : CDialog(MyControlPanel::IDD, pParent)
    {
    m_pParent = pParent;
    m_ID = MyControlPanel::IDD;
    CDialog::Create(m_ID, m_pParent);
    initItems();
    }[/cpp]


Anmelden zum Antworten