Probleme mit Acceleratoren



  • Hiho,

    ich nutze Shortcuts per Accelerator-Tabelle. Ich lade diese mit LoadAccelerators und fange entsprechend die Nachrichten in ProcessMessageFilter ab.

    BOOL CRobCalApp::ProcessMessageFilter(int code, LPMSG lpMsg)
    {
    	//Shortcuts scharfschalten
    	if(m_haccel)
        {
            if (::TranslateAccelerator(m_pMainWnd->m_hWnd, m_haccel, lpMsg))
    		{
    			return(TRUE);
    		}
        }
    
        return CWinApp::ProcessMessageFilter(code, lpMsg);
    }
    

    Soweit so ok so gut. In der Hauptanwendung (Dialogfeld) geht auch alles. Nun habe ich im Dialog einen weiteren untergeordneten Dialog, der als Steuerelement fungiert. Ist also fest und ohne Rahmen und ein Kindfenster.
    Wenn ich in diesem "Unterdialog" eine Button-ID mit einem Shortcut verbinden will, dann passiert einfach nichts. Der funktioniert nicht. Was muss ich da noch initialisieren/einrichten, damit die Shortcuts auch bei diesen Unterdialogen gehen?

    MfG Pellaeon


  • Mod

    Falscher Ansatz. Das gehört nach PreTranslateMessage!

    Eine SDI Anwednung hätte Dir diese Funktion mit Accleratoren gleich korrekt geliefert.
    Warum hast Du eine dialogbasierende Anwednung gebaut?



  • Hallo Martin,

    wenn ich das in die PreTranslate des CWinApp-Objektes mache(also in meine abgeleitete Klasse), bringt das nix. Muss das in den betreffenden Dialog rein?

    Die Shortcuts kamen später dazu, da war das alles schon auf Dialogfeld gemacht.

    MfG Pellaeon



  • Hm ok der erste Aufruf von TranslateAccelerator frisst auch die Tastenkürzel, die er nicht behandelt. Ich hab erstmal einen workaround gemacht, dass diese Funktion auch für den zweiten Dialog immer mit aufgerufen wird.

    Ist die PreTranslate da evtl an der falschen Stelle bei mir? Wie oben geschrieben habe ich sie im App-Objekt und nicht in der Dialogklasse


  • Mod

    1. Du nutzt einen GetMessage Hook! Das ist der falsche Ansatz.
    2. PreTranslateMessage eines Dialoges routet nicht in das CWinApp Objekt!
    3. In meinen Augen ist eine CDialog basierende Anwendung oft genug der falsche Ansatz:
    http://blog.m-ri.de/index.php/2008/09/07/die-unsitte-dialogbasierende-anwendungen-zu-bauen-statt-sdi-mit-cformview-zu-verwenden/



  • Hm naja da war google mal nicht mein Freund. Weil den Code da habe ich aus irgendeinem Tutorial in der Art übernommen oO.
    Erstmal danke für deine Hilfe!

    Hast du evtl. Links, Referenzen usw. wo es mal mehr um die Innereien der MFC geht, vor allem wie solche Nachrichten abgearbeitet werden?

    MfG Pellaeon


  • Mod

    Viel steht hier:
    http://msdn.microsoft.com/en-us/library/azt48yaw(VS.71).aspx

    Was PreTranslateMessage angeht und OnCmdMsg etc. ist es weise durch die Sourcen der MFC zu debuggen... 🕶


Anmelden zum Antworten