Kontextmenübefehl wird nicht ausgeführt, wieso?



  • hatte mal ein ähnliches problem. vielleicht hilft dir ja das hier:

    ON_NOTIFY_REFLECT()



  • Red Skall schrieb:

    hatte mal ein ähnliches problem. vielleicht hilft dir ja das hier:

    ON_NOTIFY_REFLECT()

    Danke. 🙂

    Ich habe das auch schon einige Male in meinem Code, aber nie selbst eingebaut.
    Also habe ich in der MSDN gesucht und ein Kapitel gefunden: Defining a Message Handler for a Reflected Message
    Da wird das alles auch gut erklärt, leider scheitere ich schon an Schritt 4.

    To define a message handler for a reflected message with ClassWizard

    1. in ClassWizard, click the Message Maps tab.
    2. From the Class name drop-down list, select the name of your control class.
    3. In the Object IDs box, select the name of your control class.
    4. In the Messages box, select the message for which you want to define a handler. Your class's reflected messages are marked with an equal sign (=).
      A message with a handler already defined is displayed in bold.

    Ich sehe da weder etwas mit einem = noch WM_COMMAND, noch die CommandID. 😕
    Und das weder bei der Viewklasse noch in der Listcontrolklasse. Naja, in der Listcontrolklasse ist immerhin die CommandID da, aber die Klasse soll das ja nicht behandeln. 😕



  • Okay, ich hatte dann doch noch ne Idee und habe nun folgendes:

    void CBasisListCtrl::OnHglagerBerechnen() 
    {
    	AfxGetMainWnd()->SendMessage(WM_COMMAND, ID_HGLAGER_BERECHNEN);
    }
    

    Das in der PreTranslateMessage ist auskommentiert und trotzdem wird der Befehl ausgeführt. Jetzt sogar nach Aufuf und vor Ausführung die OnUpdate... 🙂
    Allerdings finde ich nicht, wie ich die OnUpdate auslösen kann.

    void CBasisListCtrl::OnUpdateHglagerBerechnen(CCmdUI* pCmdUI) 
    {
    	// TODO: Code für die Befehlsbehandlungsroutine zum Aktualisieren der Benutzeroberfläche hier einfügen
    
    }
    


  • mit den wizzards arbeite ich eigentlich nie 😉 von hand ist es meistens eh schneller als vom code-generator von MS.

    das einbinden ist eigentlich kein problem:

    // *.h
    
    afx_msg void OnLvnBeginlabeledit(NMHDR *pNMHDR, LRESULT *pResult);
    
    BEGIN_MESSAGE_MAP(CDeinListCtrl, CListCtrl)
    	ON_NOTIFY_REFLECT(LVN_BEGINLABELEDIT, OnLvnBeginlabeledit)
    END_MESSAGE_MAP()
    
    void CDeinListCtrl::OnLvnBeginlabeledit(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
    
    	// ...
    
    	*pResult = 0;
    }
    

    mehr habe ich zumindest nicht gemacht 😉

    EDIT:
    Sorry, doppelpost



  • Okay, das habe ich mittlerweile hinbekommen (mit Wizard, ich habe mich sehr dran gewöhnt) - hatte da nen Brett vorm Kopf.
    Hast du noch eine Idee zu meiner nachgeschobenen Frage? 🙂



  • ne sorry. ich muss auch zugeben das ich nichtmal weis wozu OnUpdate...() gut ist und wie es aufgerufen wird 😉

    was macht denn die funktion und was willst du damit erreichen ?



  • Das ist die Funktion, in der ich einen Menüpunkt ausgrauen kann, falls er nicht aufgerufen werden soll.
    Im konkreten Fall sieht das so aus:

    void CLagerView::OnUpdateBearbeitenBerechnen(CCmdUI* pCmdUI)
    {
        pCmdUI->Enable((!m_fBerechnet) && (IstZeileMarkiert()));
    }
    

    Der Menüpunkt darf nur enabled sein, wenn eine Zeile markiert ist und diese noch nicht berechnet wurde.



  • du könntest diesen schritt ja umgehen indem du direkt vor 'TrackPopupMenu()' die entsprechenden menüeinträge deaktivierst 😉



  • Hmm, das kann ich Montag mal versuchen. Danke. 🙂



  • bei mir funktioniert es so wunderbar, dann sicherlich auch bei dir 😉

    finde das so aber auch sauberer programmiert 😉 *nicht klugscheissen wollen* 🙄



  • Red Skall schrieb:

    finde das so aber auch sauberer programmiert 😉 *nicht klugscheissen wollen* 🙄

    Sauberer als was?
    Als mit PreTranslateMessage? Auf jeden Fall, das war ja auch nur eine vorübergehende Lösung, weil ich so gleich getestet hatte, ob die Nachricht überhaupt funktioniert. 😉



  • nene, sauber als OnUpdate...() meine ich. denn du rufst das menü auf und deaktivierst in dieser funktion menüeinträge.

    besser ist finde ich das menu zu erzeugen, dann alles deaktivieren was man deaktiviert haben möchte und es dann anzuzeigen.

    ist geschmackssache würde ich sagen 😉



  • Naja, das OnUpdate... ist der normale Weg in einer SDI für das Hauptmenü, die Toolbar(s) und funktionierte bisher auch für die Kontextmenüs (wahrscheinlich, weil es das normale Bearbeiten-Menü war).

    Ist also eigentlich auch ne saubere Lösung, nur wie es scheint an dieser Stelle falsch. 😉



  • Red Skall schrieb:

    du könntest diesen schritt ja umgehen indem du direkt vor 'TrackPopupMenu()' die entsprechenden menüeinträge deaktivierst 😉

    Es hat leider nicht geklappt, da das Listcontrol nicht genug über den View weiß.
    Ich regele das jetzt mit Prüfungen in der Bearbeitungsfunktion und passenden Meldungen an den Benutzer.
    Das sollte auch gehen. 🙂


Anmelden zum Antworten