Textfeld soll nach "Enter" Focus verlieren



  • Hi,

    wie erreiche ich es, dass ein Textfeld den Focus verliert (bzw. ein anderes Steuerelement den Focus bekommt), sobald der Benutzer die Eingabe mit "Enter" abschließt?!



  • Ich würde das in PreTranslateMessage angehen:

    // Wurde eine Taste gedrückt?
    	if (pMsg->message == WM_KEYDOWN)
    	{
    		UINT  nKeyCode = pMsg->wParam; // virtual key code of the key pressed
    
    		if  (nKeyCode == VK_ENTER)
    		{
    			pMsg->wParam = VK_TAB;
    			return CDialog::PreTranslateMessage(pMsg);
    		}
    

    Kann sein, dass das nicht kompiliert und du noch casten musst, aber so etwa sollte das gehen. 🙂



  • Habe folgendes probiert:

    BOOL CKlasseDlg::PreTranslateMessage(MSG* pMsg) 
    {
    	if (pMsg->message == WM_KEYDOWN) 
        { 
            UINT  nKeyCode = pMsg->wParam; // virtual key code of the key pressed 
    
            if  (nKeyCode == VK_ENTER) 
            { 
                pMsg->wParam = VK_TAB; 
                return CDialog::PreTranslateMessage(pMsg); 
            } 	
    
    	}
    }
    

    Da bekomme ich: VK_ENTER' : nichtdeklarierter Bezeichner
    Dann habe ich VK_RETURN probiert, sobald ich dann den Dialog starte zieht er mir 100% Prozessor und es geht nix mehr 😞



  • Halt das Programm doch mal an und guck, was da los ist. 🙂

    Ansonsten gibt es noch eine andere Lösung:
    Enter irgendwie abfangen und dann kannst du mit

    GetNextDlgTabItem(GetDlgItem(IDC_wasauchimmer), FALSE)->SetFocus();
    

    arbeiten.



  • BOOL CKlasseDlg::PreTranslateMessage(MSG* pMsg)
    {
        if (pMsg->message == WM_KEYDOWN)
        {
            UINT  nKeyCode = pMsg->wParam; // virtual key code of the key pressed
    
            if  (nKeyCode == VK_RETURN)
            {
                pMsg->wParam = VK_TAB;
    
            }    
    
        }
        return CDialog::PreTranslateMessage(pMsg);
    }
    


  • Habs jetzt so gelöst:

    BOOL CKlasseDlg::PreTranslateMessage(MSG* pMsg) 
    {
    	if (pMsg->message == WM_KEYDOWN) 
        { 
            UINT  nKeyCode = pMsg->wParam; // virtual key code of the key pressed 
    
            if  (nKeyCode == VK_RETURN) 
            { 
                GetDlgItem(IDC_LST_LUFTMENGE)->SetFocus();
                return CDialog::PreTranslateMessage(pMsg); 
            } 	
    
    	}
    	return CDialog::PreTranslateMessage(pMsg); 
    }
    


  • Jetzt springt der aber immer da hin, wenn du Enter drückst - nicht nur dann, wenn du in dem Edit Enter drückst.



  • Stimmt, drum hab ich noch folgende Überprüfung gemacht:

    if(pMsg->message == WM_KEYDOWN && GetFocus()==GetDlgItem(IDC_EDT_LISTE))
    

    In einem Dialog funktioniert das jetzt auch, in einem anderen aber leider nicht, da schließt er den Dialog mit OnOK() sobald ich Enter drücke?! 😞



  • Weil wohl dein 'Beenden' oder 'Ok' Button als Default-Button eingestellt ist.
    Schau mal (falls VC .NET) bei deinem Button mit IDOK, ob Default Button auf True steht.



  • Hab VC 6, aber mit pMsg->wParam = VK_TAB; gehts jetzt bei beiden 🙂



  • Na, dann. 😉


Anmelden zum Antworten