Problem mit Shortcut



  • Hallo! Ich habe ein Problem bei der Benutzung eines Tasten-Shortcut!

    Der Anschaulichkeit halber stellen wir uns ein Dialogfeld mit 2 Buttons (Button1, Button2) vor.

    Folgendes wollte ich eigentlich erreichen: immer wenn ich die Leertaste drücke, soll Button1 gedrückt werden (egal was vorher angeklickt wurde).

    Eines vorweg: Es gibt keine Alternative zur Leertaste.

    Ich hab das ganze jetzt mehr oder weniger funktionierend mit einem Accelerator gelöst. Ein bisschen drumherum gemogelt ist es schon, da der Button1 eigentlich nicht gedrückt wird, sondern nur die Funktion die dahinter steht aufgerufen wird.

    Jetzt habe ich aber folgendes Problem: da die Leertaste in Visual C++ Dialogen generell auch Schaltflächen auslösen (=drücken) kann, wird z.B. Button2 mit gedrückt, sofern er aktiv (schwarz hinterlegt) ist und DANN erst die Funktion von Button1 ausgeführt. Noch Schlimmer ist es wenn Button1 aktiv ist und man dann die Leertaste drückt: dann wird Button1 nämlich 2x betätigt und das darf absolut nicht sein.

    Kann ich die allgemeine "Bestätigungseigenschaft" der Leertaste irgendwie deaktivieren oder muss ich mein Konzept komplett ändern?

    Wäre für Hilfe sehr dankbar!



  • Versuch es mal statt mit dem Accellerator mit PreTranslateMessage.
    Wenn du dann einfach nicht die Basisklasse aufrufst, wird die Standardbehandlung auch nicht gemacht. Du solltest aber darauf achten, dass es NUR bei der Leertaste so gemacht wird und ob du dir ggf. woanders ne Falle stellst.



  • PreTranslateMessage hab ich benutzt

    BOOL CGLPStopwatchDlg::PreTranslateMessage(MSG* pMsg) 
    {
        if(pMsg->message==WM_KEYDOWN)
        {
            	if(pMsg->wParam == VK_SPACE)
    		{
    		   //hier wird die Funktion aufgerufen
    		}
    
        }
        return CDialog::PreTranslateMessage(pMsg);
    }
    

    verstehe aber nicht wie das jetzt funktionieren soll, dass space auch nichts anderes macht als die funktion aufzurufen



  • Such den Unterschied:

    BOOL CGLPStopwatchDlg::PreTranslateMessage(MSG* pMsg) 
    {
        if(pMsg->message==WM_KEYDOWN)
        {
            if(pMsg->wParam == VK_SPACE)
    	    {
    	   //hier wird die Funktion aufgerufen
    	    return TRUE;
            }
        }
        return CDialog::PreTranslateMessage(pMsg);
    }
    


  • huch! 😃

    danke es funktioniert


Anmelden zum Antworten