Button aktivieren / deaktivieren



  • Hallo zusammen,

    ich habe ein paar Buttons in einer SDI-Anwendung dynamisch erstellt und das funktioniert auch wunderbar.
    Wenn ich einen diesen Button klicke möchte ich, dass er deaktiviert wird (grau) ...
    Er wird wieder aktiviert erst wenn ich einen der anderen Buttons klicke...usw.
    D.h. der gerade angeklickte Button soll immer deaktiviert sein, während alle anderen aktiv sind
    Wie mache ich das?
    Danke im Voraus



  • Du rufst EnableWindow() auf.

    Beispiel (deaktiviertes Button):

    CButton *bDeinButton;
    
    bDeinButton->EnableWindow(FALSE);
    

    Mit ShowWindow() zeigst / versteckst du deine Buttons. Das funktioniert mit jedem von CWnd abgeletetem Objekt (also auch Fenster).



  • Ich habe jetzt folgender Maßen probiert:

    ON_CONTROL_RANGE(BN_CLICKED, FIRST_ID, LAST_ID, &CMeinView::OnBnClicked)
    
    void CMeinView::OnBnClicked(UINT ID)
    {
         .....
    	GetDlgItem(ID)->EnableWindow(false);  // Button deaktivieren
    
        //Jetzt der vorherige Button aktivieren 
        ?????
    }
    

    Gibt's eine Methode, die mir die ID des vorher angeklickten Buttons ermittelt?
    Danke.



  • void CMeinView::OnBnClicked(UINT control_id)
    {
        static UINT old_id = 0; // korrigiert!
        if (old_id != 0)
            GetDlgItem(old_id)->EnableWindow(TRUE);
        old_id = control_id;
    
        GetDlgItem(old_id)->EnableWindow(FALSE);
    }
    

    ...



  • Mit dem "satic" bekomme ich einen Fehler.
    "default-int" wird von C++ nicht unterstützt.
    mit anderen variablen-Typen wie unsigned long usw... werden die angeklickten Buttons nach einander deaktiviert.



  • du legst dir in deiner dialogfeldklasse ne variable an (z.B. 'int iLastID').

    im construktor setzt du die variable auf '-1'.

    der code sieht jetzt so aus:

    void CMeinView::OnBnClicked(UINT control_id)
    {
        if (iLastID != -1)
            // Letztes Button aktivieren:
            GetDlgItem(iLastID)->EnableWindow(TRUE);
    
        // Dieses Button merken:
        iLastID = control_id;
    
        // Dieses Button deaktivieren:
        GetDlgItem(control_id)->EnableWindow(FALSE);
    }
    


  • Vielen Dank.
    Jetzt funktioniert's wunderbar.



  • Manim schrieb:

    Mit dem "satic" bekomme ich einen Fehler.
    "default-int" wird von C++ nicht unterstützt.
    mit anderen variablen-Typen wie unsigned long usw... werden die angeklickten Buttons nach einander deaktiviert.

    (D)evil hat in seinem Bsp. nach dem static ein int vergessen. 😉



  • connan schrieb:

    (D)evil hat in seinem Bsp. nach dem static ein int vergessen. 😉

    ups ... ja, jetzt funktioniert's auch.
    Vielen Dank an euch allen, ihr habt mir sehr geholfen.

    Viele Grüße,
    Manim



  • Das Glück war leider nur von kurzer Dauer 😞
    Das Programm stürzt jetzt immer wieder ab, wenn ich eine neue ButtonsListe lade und auf einen diesen Button klicke.
    Der Fehler tritt in der Datei winocc.cpp auf, in der Zeile 3

    1   BOOL CWnd::EnableWindow(BOOL bEnable)
    2{
    3	  ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));
    4
    5	  if (m_pCtrlSite == NULL)
    6		  return ::EnableWindow(m_hWnd, bEnable);
    7	  else
    8		  return m_pCtrlSite->EnableWindow(bEnable);
    9  }
    

    Im Call-Stack steht die Zeile in der ersten Stelle mit einem gelben Pfeil

    >	mfc80d.dll!CWnd::EnableWindow(int bEnable=1)  Zeile 349 + 0x3 Bytes	C++
    

    dann die folgende Zeile:

    >	MeinProgramm.exe!CMeinView::OnBnClicked(unsigned int control_id=29006)  Zeile 105	C++
    

    die auf den Code:

    iLastID = control_id;
    

    aufweist.

    Hat jemand eine Erklärung, warum das so ist?
    Danke.



  • da wird wohl etwas mit deinem button nicht stimmen. entweder nicht richtig initialisiert, oder pointer auf NULL o.ä.


Anmelden zum Antworten