Wie kriege ich einen Button hier rein???



  • Hallo.

    Ich habe ein MFC-Projekt wie in meinem C++ Buch beschrieben angelegt.
    Es ist ein SDI-Projekt und besteht aus Prog_1View, Prog_1App, Prog_1Frame und Prog_1Doc.
    Ist also ein Minimal-Projekt würde ich sagen.
    Wenn ich das Programm starte erscheint ein Fenster in das ein kleines schwarzes Viereck gezeichnet wird.

    Ich will nun unter dem Viereck einen Button platzieren und wenn ich auf den Button klicke soll die
    Farbe des Vierecks von schwarz auf weiss wechseln.
    Bei einem erneuten klick soll das Viereck wieder schwarz werden und so weiter.

    Nun meine Frage.
    Wie bekomme ich einen Button auf die Seite?????

    Oder was ist mit anderen Steuerelementen auf der Seite. Vielleicht ein Textfeld in dem die aktuelle Farbe
    angezeigt wird.

    In den Beispielen die ich habe wird immer ein Dialogfenster aufgerufen oder es werden über das Menü irgendwelche eingeben gemacht.

    Ich will die Steuerelemente aber in dem Fenster haben in dem auch die Ausgabe in diesem Fall die Zeichnung ist.

    plutonium2



  • Du legst dir Membervariablen der gewünschten Steuerelemente in der Klasse in der Headerdatei an, also in der View-Klasse.
    Dann musst du die OnCreate überschreiben, falls sie nicht schon da ist.

    Den Button legst du dann mit Create an, z.B

    m_smallButton.Create(_T("Klein"),WS_CHILD |WS_VISIBLE | WS_BORDER,
                              CRect(400,120,450,140),this,IDC_LISTVIEW_SMALL);
    

    Um den Button-Click abzufangen, gehst du in der cpp-Datei deiner Viewklasse in die Messagemaüp und fügst sowas ein

    ON_COMMAND(IDC_LISTVIEW_SMALL,OnSmall)
    

    Das erste ist die ID des Buttons, das zweite die Methode, die nach einem Klick aufgerufen werden soll. Diese muss dann natürlich auch in der Klasse existieren.



  • Hallo Pellaeon.
    Kriege es leider nicht hin.

    „Du legst dir Membervariablen der gewünschten Steuerelemente in der Klasse in der Headerdatei an, also in der View-Klasse“

    Habe folgendes in der ButtonTestView.h per hand eingefügt.

    public:
    CButton m_smallButton;

    Geht das auch mit dem Klassenassistent?

    OnCreate gibt es nicht in der ButtonTestView.cpp weshalb ich den Code zum erzeugen des Buttons in den Konstruktor von CbuttonTestView gelegt habe.

    m_smallButton.Create(_T("Klein"),WS_CHILD |WS_VISIBLE | WS_BORDER,
    CRect(400,120,450,140),this,ID_LISTVIEW_SMALL);

    Bekomme nun die Fehlermeldung error C2065 „ID_LISTVIEW_SMALL“ nicht deklarierter Bezeichner.

    Ich weiss nicht wohin mit dem ID_LISTVIEW_SMALL. Das soll ja die ID des Buttons werden.
    Bisher habe ich nur mit der Steuererlement-Palette Buttons in eine Dialogbox eingefügt und dann durch einen Rechtsklick auf des Element die ID vergeben.
    Die ID ist dann natürlich auch im Klassenassistenten aufgetaucht und ich konnte eine Nachricht und eine Memberfunktion dafür erstellen.

    Ich kann aber die ID_LISTVIEW_SMALL nicht in der Nachrichtenzuordnungstabelle finden und deshalb auch keine Nachricht festlegen. Wohin mit dem Ding?

    Komme damit „Um den Button-Click abzufangen, gehst du in der cpp-Datei deiner Viewklasse in die Messagemap und fügst so was ein“ auch gar nicht klar.

    Bräuchte noch ein bisschen Hilfe.

    plutonium2



  • ID vergeben:

    Gehst du in die Ressourcenansicht und markierst den Ornder <Projektname>.rc. NUr markieren mit nem einfachen Mausklick
    Jetzt im Menü "Bearbeiten" auf Ressourcensymbole klicken.
    Im neuen Dialog jetzt einfach "Neu ..." anklicken und den Ressourcennamen vergeben. Aner Zahl muss man nix ändern, das VS schlägt einfach eine bisher nicht genutze vor.

    Deine Membervariable hast du richtig angelegt. Das geht auch mit dem Assistenten. Gehst du einfach in die KLassenansicht, rechtsklick auf die gewünschte Klasse. Dort dann das Menü "Hinzufügen->Variable hinzufügen..." benutzen.

    Im Konstruktor kannst du die Buttons noch nicht erstellen. DIese benötigen das Windows-Fenster. Das existiert aber noch nicht im Konstruktor, sondern wird erst in der OnCreate erstellt.

    Mache in der Klassenansicht Rechtsklick auf deine Viewklasse und öffne die Eigenschaften. Dort gehst du in das Menü "Meldungen"(Links neben der grünen Raute).
    Dort suchst du den Eintrag WM_CREATE und legst dir dafür ne Methode an.
    Die neue Methode ruft zuerst ihre Elternklassen auf. Das muss drinnen bleiben!!!
    Nach diesem Aufruf fügst du dann deine eigenen Creates ein, kurzes Bsp:

    int CCommonView::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	if (CScrollView::OnCreate(lpCreateStruct) == -1)
    		return -1;
        //hier dann das create für die Buttons
    
        return 0;
    }
    

    So irgendwo in der cpp-Datei zu deiner view steht sowas

    BEGIN_MESSAGE_MAP(CCommonView, CScrollView)
    	// Standarddruckbefehle
    	ON_COMMAND(ID_FILE_PRINT, &CScrollView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CScrollView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CScrollView::OnFilePrintPreview)
    	ON_WM_CREATE()
    usw.
    

    Die Klassennamen sind natürlich anders bei dir 🙂 Dort rein muss das ON_COMMAND. Das sorgt dafür, dass deine Klasse die Nachricht abfängt, wenn der Button gedrückt wurde.



  • Hallo Pellaeon.

    ID vergeben:
    Habe ich gemacht. Musste allerdings auf Dateiansicht gehen. Dort konnte ich die ButtonTest.rc anklicken.
    Dann bin ich auf „Ansicht Ressourcensymbole“ gegangen und habe mit „neu“ IDC_ListView_SMAIL angelegt.

    Das mit „Membervariable anlegen“ habe ich nach deiner Beschreibung hin bekommen. Super.

    „Mache in der Klassenansicht Rechtsklick auf deine Viewklasse und öffne die Eigenschaften. Dort gehst du in das Menü "Meldungen"(Links neben der grünen Raute).“
    Funktioniert bei mir nicht.
    Wenn ich auf „Klassenansicht Rechtsklick auf deine Viewklasse und öffne die Eigenschaften“ klicke erscheint ein Dialog „klasse eigenschaften“ mit nur einem Reiter. Da gibt es keine Raute und kein WM_CREATE.

    Habe einen Rechtsklick auf meine Viewklasse getan und dann „Behandlungsroutine für Windowsnachrichten hinzufügen“ gewählt.
    Komme so zu der OnCreate.

    Sieht dann bei mir wie in deinem Code-Beispiel aus.
    Funktioniert alles.
    Echt super und vielen, vielen Dank.

    plutonium2



  • Hallo Pellaeon.

    Es funktioniert alles.
    Ich habe aber trotzdem noch eine Frage.
    Wenn ich auf die Datei ButtonText.rc klicke und dann auf Ansicht und Ressourcensymbole klicke
    sehe ich meine angelegt IDC_LISTVIEW und andere die MFC wohl selbst angelegt hat..
    Bei allen andere ist ein Häkchen dahinter und wenn ich sie anklicke steht unten bei „Verwendet von“ wer sie benutzt.
    Nur bei meinem IDC_LISTVIEW ist kein Hacken und wenn ich darauf klicke bleibt „Verwendet von“ leer.
    Ist das ein Problem.
    Wirkt sich das möglicherweise später aus wenn ich das Programm erweitere.

    plutonium2



  • Ich würde sagen keine Probleme. Bei den selbst vom Assistenten erstellten IDs weis er ja, zu welchen Klassen usw die gehören und die zeigt er halt dort an. Mit deinen selbt angelegten IDs kann der Assistent einfach nix anfangen, deswegen ist da halt kein Häckchen.


Anmelden zum Antworten