Will einen Button disablen und enablen



  • Hallo.
    In meinem Programm gibt es ein Dialogfenster mit einem Button.
    Der Button soll am Anfang erst einmal disabled sein. Also grau unterlegt und nicht anklickbar.
    Wie kriege ich den Button disabled und wie kann ich ihn wenn eine bestimmte andere Action erfolgt ist wieder enablen so das ich ihn anklicken kann?

    plutonium2



  • Das geht mit der Funktion "EnableWindow()" (wenn du als Parameter FALSE angibst, wird das "Fenster*" deaktiviert, bei TRUE aktiviert)

    (*) Unter MFC gelten alle Dialogelemente - also auch Buttons, Eingabefelder oder Radiobuttons - als Fenster



  • Hallo CStoll.
    Erst einmal Danke für die Antwort.
    Komme damit aber noch nicht viel weiter.
    Wie wende ich denn "EnableWindow()" auf den Button an.
    Soll ich etwa die IDC des Buttons verwenden also
    IDC_MyButton.EnableWindow(FALSE); und später dann
    IDC_MyButton.EnableWindow(TRUE); ?

    plutonium



  • Die eleganteste Methode ist es wohl, dir zu deinem Button eine (Control)Membervariable anzulegen und dann diese anzusprechen. (das geht über den Klassen-Assistenten von Visual Studio).

    Andernfalls mußt du dir jedes Mal zu deiner ID ein CWnd besorgen, damit du dessen Methdode aufrufen kannst:

    GetDlgItem(IDC_MyButton)->EnableWindow(FALSE);
    

    (Die IDC ist nur ein int-Wert, mit dem du deinen Button identifizierst)


  • Mod

    Was du hier mit IDC_MyButton hast ist nur eine Nummer. Eine ID die diesen Schalter im Dialog möglichst eindeutig identifiziert.
    Das Fenster bekommst Du duch GetDlgItem.

    Also:

    GetDlgItem(IDC_MyButton)->EnableWindow(FALSE);
    


  • Na am sichersten wäre wohl:

    CWnd* pButton1 = GetDlgItem(IDC_MyButton);
    if (pButton1 == NULL)
        return;
    
    pButton1->EnableWindow(FALSE);
    

    😉 Aber eigentlich vollkommen sinnfrei:D



  • Hallo ihr drei.
    Danke für die Antworten.
    Habe alles ausprobiert und es funktioniert. Echt suoer.

    plutonium2



  • Jo sind auch alle 3 im Grunde die selben, nur das ich noch überprüft habt das der Pointer nicht ins Nirvana zeigt 😉



  • Hallo (D)Evil.
    Na ja. Nicht ganz.
    CStoll schreibt. "Die eleganteste Methode ist es wohl, dir zu deinem Button eine (Control)Membervariable..."
    Habe ich gemacht.
    Der Zugriff funktioniert dann über m_B1.EnableWindow(FALSE);
    Ich greife dann direkt auf die Instanz des Buttons zu.
    Bei GetDlgItem(IDC_MyButton)->EnableWindow(FALSE);
    arbeite ich ja mit einem Zeiger (...->.EnableWind...).
    Kommt wohl auf das selbe ergebnis raus ist aber nicht das selbe
    oder sehe ich da etwas falsch.
    Wenn ja wüsste ich das gerne.

    plutonium2



  • Das mit der Kontrollvariable ist etwa so, als ob du am Anfang des Programms einmal dein GetDlgItem() aufgerufen und dir das Ergebnis dann für die weitere Laufzeit gemerkt hättest (OK, MFC macht das vermutlich etwas anders, aber das Prinzip ist klar).
    Mit GetDlgItem() fragst du jedes Mal, wenn es benötigt wird, dein Betriebssystem nach einem CWnd für deinen Button.



  • Achso .. ne hatte nur das mitm Pointer bei CStoll gesehen ...


Anmelden zum Antworten