Button bleibt inaktiv



  • Hallo

    Ich habe seit gestern ein komsiches Problem: Um ein Programm zu erweitern, habe ich einen bestehenden Dialog (Typ CDialogBar) kopiert, eine Klasse erzeugt und begonnen, ihn nach meinen Wünschen abzuändern. Funktioniert gut. Dann wollte ich noch einen Button erzeugen (bis dahin habe ich nur Picture Control verwendet) und nun lässt sich das Ding einfach nicht aktivieren. Ich versuchte, es mit EnableWindow(true) zu aktivieren, doch das klappt einfach nicht (hab die richtige ID genommen!!). Ich habe aber noch alte Buttons auf dem Dialog, diese funktionieren, aber nur, bis ich die ID ändere. Oder gebe ich meinem neuen Button die ID eines bestehenden, dann klappt es auch. Also muss irgendwo bei der ID ein Fehler sein, aber ich finde keinen. 😕

    Hat jemand eine Ahnung, was das sein könnte?

    Vielen Dank!



  • Erste Frage: Welche ID hat der Button?
    Zweite Frage: In welcher Funktion des Dialoges willst du den aktivieren. Und wie? Zeig doch mal ein Stückchen Code.



  • Nennen tut er sich standardmässig IDC_BUTTON1, im Resource.h ist er eingetragen, und wenn ich doppelklicke, komme ich in die aufgerufenen Methode der Klasse:

    void CMachine250::OnBnClickedButton1()
    {
    // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    }
    

    und in der MessageMap ist er auch eingetragen

    ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
    

    Dann versuche ich, den Button zu aktivieren (obschon er ja bereits aktiviert sein müsste)

    CButton* B = (CButton*)GetDlgItem(IDC_BUTTON1);
    B->SetWindowText("Hello World...."); // Um zu sehen, obs der richtige Button ist
    B->EnableWindow (true);
    


  • Nachtrag:

    Ein OnInitDialog gibt es im CDialogBar ja nicht, darum rufe ich zu Beginn eine eigene Methode zum initialisieren auf. In diese geht er auch hinein.

    Vielleicht noch was, als ich die Klasse erstellt habe, konnte ich dort im Assistent CDialogBar nicht auswählen, darum nahm ich CDialog und habe dann dies im Code manuell geändert. Könnte es daran liegen?



  • Immernoch: In welcher Funktion willst du den Button aktivieren?

    Wird denn der Text geändert?

    Und änder deinen Quelltext bitte so ab:

    CButton* B = (CButton*)GetDlgItem(IDC_BUTTON1); 
    ASSERT(B); // Damit du merkst, wenn der Button nicht gefunden wurde.
    B->SetWindowText("Hello World...."); // Um zu sehen, obs der richtige Button ist 
    B->EnableWindow (true);
    

    Kriegst du dann eine Assertion?



  • Nein, bekomme keine Assertion. Und ja, der Text wird geändert.



  • Und meine anderen Fragen? Da hätte ich auch gerne eine Antwort drauf...

    Ich glaube nicht, dass deine Probleme von der geänderten Basisklasse kommen. Allerdings hab ich mich da noch nicht so drum gekümmert (um CDialogBar) und bin mir nicht sicher.

    Vielleicht hat ja jemand anders aus dem Forum damit Erfahrungen?



  • Hab das Problem gefunden. Im alten Dialog wurden die Messages vom MainFrame gehandlet. In meinem neuen von der neuerzeugten Klasse. Nur: aus irgend einem Grund musste ich nun den Eintrag aus der Messagemap der neuen Klasse in die Messagemap des MainFrames kopieren, um den Button mit dem Programm bekannt zu machen. Ist nun wohl keine sehr schöne Methode, aber es funktioniert.

    Oder weiss noch jemand, wie das im Hintergrund abgearbeitet wird?


Log in to reply