Haken im Menu aus anderem Dialog entfernen



  • Hallo!

    Ich habe folgendes Problem: Ich rufen einen Dialog nichtmodal auf und will, dass dieser den Haken im Menu (in dem vom Startdialog) beim Schließen entfernt.

    Folgendes habe ich da zu stehen:

    void CNichtmodalDlg::OnClose() 
    {
    	CHauptDlg HauptDlg;
    
    	CMenu *pMenu =  HauptDlg.GetMenu();
    	pMenu->CheckMenuItem(ID_VIEW_ITEM1,MF_UNCHECKED);	
    
    	CDialog::OnClose();
    }
    

    Das Programm stürzt nun beim Schließen des nichtmodalen Dialoges ab.



  • Das Problem wird sein dass 'pMenu' garkein Element mit der ID ID_VIEW_ITEM1 hat. pMenu ist das Hauptmenu des Dialogs, aber wahrscheinlich ist das Häkchen in einem Untermenü. Da musst Du also zuerst hinnavigieren.

    Aber was anderes:
    Du solltest den Haken nicht von einem anderen Dialog aus manipulieren. Füge für das Menüelement lieber eine OnUpdateCommand Funkiton ein (mit dem Klassenassi), und in der schaust Du ob der andere Dialog noch auf ist und setzt den Haken dann dementsprechend. Das geht da ganz einfach mit pCmdUI->SetCheck( TRUE/FALSE )



  • Danke für die Antwort. Aber wie kann ich kontrollieren, ob der Dialog geöffnet ist oder geschlossen? Und meine zweite Frage: Wie meinst du das mit dem "hindurchnavigieren"? Wie geht das?



  • The MK schrieb:

    Wie meinst du das mit dem "hindurchnavigieren"? Wie geht das?

    Ich vermute, dass du auf einen Menüpunkt im Menü "Ansicht" zugreifen möchtest. Mit pMenu hast du dir mal Zugriff auf die Menüleiste geholt. Von hier aus kannst du auf ein Menü in der Menüleiste zugreifen mit

    pMenu = pMenu->GetSubMenu(2);    //liefert dir Zugriff auf das Menü "Ansicht"
    

    Jetzt kannst du mit

    pMenu->CheckMenuItem(ID_VIEW_ITEM1,MF_UNCHECKED);
    

    beim Menüpunkt mit der ID ID_VIEW_ITEM1 den Haken entfernen.



  • Ich habs jetzt mal so ausprobiert:

    void CNichtmodalDlg::OnClose() 
    {
    
         CHauptDlg *HauptDlg = NULL;
    
         CMenu *pMenu =  HauptDlg->GetMenu();
         CMenu *pSubMenu = pMenu->GetSubMenu(2);
         pSubMenu->CheckMenuItem(ID_VIEW_ITEM1,MF_UNCHECKED);	
    
         CDialog::OnClose();
    
    }
    

    Das klappt aber immer noch nicht. Das Teil schmiert ab, wenn ich GetMenu aufrufe. Ich habe aber keine Ahnung, wo der Fehler liegt.



  • das ist ja ganz klar. du rufst eine Methode mit einem NULL-Zeiger auf.

    CMenu *pMenu = HauptDlg->GetMenu();

    HauptDlg ist ja NULL. wie soll das gehen? das muss schon auf was gültiges zeigen 😉



  • Naja... Stimmt. Aber auf was?



  • Auf den Hauptdialog 🤡



  • Und wie geht das?



  • Kommt schon, Leute. Ihr wisst es doch.


Anmelden zum Antworten