[Ressourceneditor] Per Menü ein neuen Dialog öffnen



  • Hallo.
    Ich übe gerade im Visual Studio.

    Hab mir schon ein kleines Programm geschrieben, was ein Dialog öffnet.
    Diesem Dialog hab ich wiederrum ein Menü gegeben/gebastelt.

    Nun hab ich parallel ein weiteren Ressource (Dialog IDD_DIALOG2) hinzugefügt.

    Ich möchte nun, dass wenn ich im Menü "Test" anklicke, sich der Dialog (IDD_DIALOG2) öffnet.

    Habs schon probiert und nen Screenshot gemacht aber leider tut sich nichts.

    Screeen: http://img94.imageshack.us/i/screenm.jpg/

    Hab dem Menüpunkt einfach die ID vom Dialog gegeben.

    Würde mich freuen wenn mir jemand helfen kann.



  • das was du gemacht hast ist dem Menupunkt Test die ID Resource IDD_DIALOG2 zuzuweisen. du hättest genau so dem Menupunkt ne IDC_SCHLAGMICHTOT zuweisen können. Diese ID Resource braucht das Menu um die Nachrichtenschleife zu benachrichtigen, das diese Resource angeklickt wurde und in der Nachrichtenschleife fängst du diese ID Resource wieder ab.

    du must dir ein klickereigniss für die Menuresource erstellen und die klasse für deinen IDD_DIALOG2 mit der Klasse in der du das klickereigniss für die Menuresource erstellt hast verbinden. und im klickereigniss kannst du dann mit ner membervariable für deine Dialogklasse und DoModal deinen Dialog öffnen.
    😉



  • #include "MyDialog.h"
    
    ...
    
    void OnButOpenDlg()
    {
    MyDialog dlg;
    dlg.DoModal;
    }
    

    MfG
    Bara



  • @Barados
    😃 hab mir auch schon überlegt ob ich ihm nicht den link vom anderen thread gebe 😉



  • heyheyhey

    da hab ich kein include geschrieben 😃



  • Barados schrieb:

    #include "MyDialog.h"
    
    ...
    
    void OnButOpenDlg()
    {
    MyDialog dlg;
    dlg.DoModal;
    }
    

    MfG
    Bara

    Aber wo binde ich diesmal diesen Code ein?!
    Das Menü hat bei mir irgednwie kein richtigen code so wie der Dialog vorhin^^



  • das menu hat auch keinen code im sinne einer klasse.
    du erstellst dir ein klickereigniss in der klasse, (für dein menu) für den dialog, für den das menu gelten soll. in deinem fall, nehm ich jetzt mal an, ist es der hauptdialog.



  • Hab nur den Code in der .rc gefunden:

    /////////////////////////////////////////////////////////////////////////////
    //
    // Menu
    //
    
    IDR_MENU1 MENU 
    BEGIN
        POPUP "Menü"
        BEGIN
            MENUITEM "Test",                        IDD_DIALOG2
            MENUITEM SEPARATOR
            MENUITEM "Beenden",                     IDOK
        END
    END
    


  • @rT!f@Ct schrieb:

    das menu hat auch keinen code im sinne einer klasse.
    du erstellst dir ein klickereigniss in der klasse, (für dein menu) für den dialog, für den das menu gelten soll. in deinem fall, nehm ich jetzt mal an, ist es der hauptdialog.

    Ah ok.
    Und wie genau sieht so ein Klickerereignis aus?
    Einfach wieder ne Klasse für den zweiten Dialog erstellen?!

    Und wo genau binde ich denn

    MyDialog dlg;
    dlg.DoModal;

    ein, wenn Menü kein richtigen "Code" hat?



  • Sorry für mein dritten "Doppelpost". (Werde mich mal hier demnächst anmelden, dann kann ich auch editieren).

    Also ich habe das Prinzip schon verstanden.
    Und wenn im aktuellen Dialog ein Button einbaue, der wiederrum ein zweiten Dialog öffnet, habe ich auch hinbekommen.

    Da hab ich wieder einfach ne Klasse gebaut, .h includiert und

    void MyDialog::OnBnClickedButton2()
    {
    	MyDialog2 dlg1;
        dlg1.DoModal();
    }
    

    geschrieben. Aber beim Menü weiß ich nicht, wie und wo genau ich DoModal() hinschreiben soll 😞 Da Menü ja kein Code hat in der Form wie der Dialog.



  • Pfannnii schrieb:

    Ah ok.

    dem nach zu urteilen was du schreibst

    Pfannnii schrieb:

    Und wie genau sieht so ein Klickerereignis aus?
    Einfach wieder ne Klasse für den zweiten Dialog erstellen?!

    ist nix Ah ok...

    kauf dir ein buch wo die grundlagen der programmierung erklärt werden(Visua c++ in 21 tagen...(oder so)). beiß dich da durch. es ist nicht böse gemeint, aber es bringt nichst, dir noch weiter zu erklären wie, wo und was du tun must, es wurde alles gesagt, was du brauchst. alles andere wäre sinnlos und würde zu einem endlosen thread führen. dieses forum (und andere) ist auch nicht dafür da, dich in die programmierung einzuführen, sondern eher eine hilfestellung für explizite Fragen (grundkenntnisse immer vorausgesetzt).

    [NEW EDIT]
    anscheindet hast du es verstanden

    Pfannnii schrieb:

    Und wenn im aktuellen Dialog ein Button einbaue, der wiederrum ein zweiten Dialog öffnet, habe ich auch hinbekommen.

    genau so must du es mit dem menupunkt machen. einfach ein klickereigniss erstellen, in der klasse in der du das klickereigniss für den butten gemacht hast.



  • Danke für deine Antworten.
    Aber ich glaub du hast meine Frage nicht ganz verstanden. 🙂

    genau so must du es mit dem menupunkt machen. einfach ein klickereigniss erstellen, in der klasse in der du das klickereigniss für den butten gemacht hast.
    

    Genau das ist meine Frage. Bei dem Button hatte ich bisher immer ein Quelltext, wo ich das Klickereignis reinschreiben konnte.

    Aber das Menü hat ja kein Quelltextbasis, wo ich einfach:
    DoModal();
    benutzen kann.

    Ich vermute mal du meinst, diese Codezeile hier in der Klasse MyDialog2

    /.......
    public:
    	afx_msg void OnBnClickedButton1();
    };
    /.......
    

    Ich muss da bestimmt sowas wie

    afx_msg void ClickMenuPunktXXX()
    

    schreiben, oder?

    Wenn ja,
    wie genau ist die Synthax für OnBnClicked"Menüpunkt"?!

    Ps.
    Werde mir bald nen Buch zulegen.
    Hab schon eins, aber das ist veraltet^^



  • nein Pfannni,
    ich hab dich schon verstanden, nur du hast meine antwort nicht verstanden!!!

    🙄 nochmal ganz langsam zum mitdenken 😉

    das menu hat keinen code/klasse in die man ein klickereigniss schreiben könnte.
    das menu ist eine resource. siehe *.rc datei.

    du must aus dem resourceneditor den menupunkt mit einer resourcenid verbinden.

    danach must du über den klassenassi für die resourcenid des menupunktes(Test)
    ein klickereigniss erstellen. das klickereigniss erstellst du in der Klasse die mit dem Dialog in verbindung steht, für den du das menu erstellt hast.
    in deinem fall wäre das der Hauptdialog.

    MERKE:
    der weg für das klickereigniss des Menupunktes, ist genau der gleiche, wie für das klickereigniss des Buttens!!



  • Erstmal vielen Dank für deine Geduld. 🙂

    danach must du über den klassenassi für die resourcenid des menupunktes(Test)
    ein klickereigniss erstellen.

    Was genau versteht man unter Klickereignis?
    Im Klassenassistent wird ja kaum AddClass->"Klickereignis" stehen, oder?

    Und nochmal vielen Dank für deine Geduld ^^
    Werde mich demnächst mal mehr mit dem "theoretischen" beschäftigen.



  • HALLLLOOOOO!!!!

    @rT!f@Ct schrieb:

    MERKE:
    der weg für das klickereigniss des Menupunktes, ist genau der gleiche, wie für das klickereigniss des Buttens!!

    mehr kann und will ich jetzt nicht mehr sagen...
    auser na vieleicht doch...

    kauf dir'n buch!!! 🙄
    hat mir auch gehelft...



  • Ey das gibts doch nicht, dass ich das nicht checke...*an mir selbst zweifel*

    Also...

    das menu hat keinen code/klasse in die man ein klickereigniss schreiben könnte.
    das menu ist eine resource. siehe *.rc datei.

    du must aus dem resourceneditor den menupunkt mit einer resourcenid verbinden.

    Verstanden 🙂

    danach must du über den klassenassi für die resourcenid des menupunktes(Test)
    ein klickereigniss erstellen

    Also in dem Fall für IDD_DIALOG2, richtig?

    Ich habe nun den Menüpunkt (Test) mit der ID IDD_DIALOG2 verbunden und für DIALOG2 wieder über den Klassenassi ein Klasse + h. & .cpp File erstellt.

    Richtig bisher?

    Normaler weiße würde ich nun die .h Files includieren und im Quelltext den Button suchen:

    void CMyWindow::OnRButtonDown(UINT nFlags, CPoint point)
    {
    
    	//...to do...
    
    }
    

    und dort einfach

    MyDialog2 dlg1;
    dlg1.DoModal(); //Nur zu Verständnis: Das ist doch das Klickereignis, oder?
    

    schreiben.

    Mein Problem ist jetzt nur, dass ich nicht weiß wo ich für mein Menüpunkt mein Klickereigbnis (dlg1.DoModal();) hinschreiben soll.



  • bis Verstanden 🙂 ist es richtig.

    Ich habe nun den Menüpunkt (Test) mit der ID IDD_DIALOG2 verbunden

    der erste fehler ist den menupunkt mit der IDD_DIALOG2 zu verbinden, denn diese ID ist die ResourcenID deines Dialoges den du öffnen willst.

    erstell dir in der Resourcen.h eine ResourcenID für deinen Menupunkt, so wie du es für den Button gemacht hast.
    zB.

    #define IDC_MENU_TEST  3000//Zahl wird vom ResourcenEditor zugewiese
    

    diese ResourcenID (IDC_MENU_TEST) verbindest du mit dem Menupunkt (Test) so wie du es fälschlicherweise mit der ResourcenID IDD_DIALOG2 getan hast.

    und für DIALOG2 wieder über den Klassenassi ein Klasse + h. & .cpp File erstellt.

    soweit richtig
    die *.h des DIALOG2 bindest du jetzt in die *.h ein in der du das klickereigniss für den Menupunkt haben willst.(also in die klasse in der das klickereigniss für den button ist)

    Alles was du jetzt noch tun must, ist ein Klickereigniss für den Menupunkt zu erstelle. und das geht genau so wie du das Klickereigniss für den Button erstellt hast.



  • Wieso macht ihr dem Neuling das so kompliziert? 😛

    @Pfanni:

    Einfach mit "add class" (hier der so genannte Klassenassi) eine Klasse für dein zweiten Dialog erstellen.
    Die vom Studio generierte .h File includierst du.

    Dann öffnest du das Menü im Ressourcen-Editor und erstellst da entsprechend deine Menüpunkte.

    Dann Rechtsklick auf ein Menüpunkt und auf "Add Event Handler".
    Da wählst du einfach aus, in welcher Klasse sich das Menü befindet (also du wählst da bei Class: MyDialog aus.

    Dann macht Studio von ganz allein, die passende Quelltextänderung und springt sofort zum:

    void MyDialog::OnMenuTest()
    {
    
    }
    

    und dort fügst du einfach das

    MyDialog2 dlg1;
        dlg1.DoModal();
    

    ein und fertig ist der Salat 🙂 Guten Hunger und viel Spaß.



  • Hallo Leute!

    Ich habe das jetzt auch mal probiert. Bin dabei nach der Anleitung von "wm-gewinner.de" vorgegangen. Beim Test ist der Menüpunkt jedoch inaktiv(grau). Was habe ich vergessen/falsch gemacht??

    MfG Marc :xmas1:


Anmelden zum Antworten