Navigation im Dialogfeld



  • Hi,

    ich habe zwei Editfelder und drei Button in meinem Dialogfeld.

    Edit1 Button1
    Edit2 Button2
    ButtonExit

    Wenn ich mein Programm starte und dann die Entertaste drücke, wird Button Exit ausgelöst. Ich möchte aber, das erstmal nichts passiert.
    Wenn man dann im Edit1 schreibt und man die Entertaste drückt soll Button1 ausgelöst werden.
    Schreibt man im Edit2 soll Button2 ausgelöst werden.
    Wie mach ich das?
    😕



  • du musst die TAB reihe aendern. bei dir ist wenn der dialog geofnnet wird automatisch der tab auf exit. musst die reihe umaendern,wie dass geht musst bissle selber schauen.

    dann anendern z.b. auf dein edit1 feld

    oder bei exit eine abfrage machen

    blablabla:blablabla on buttonexitklickbums
    {
    
    if( edit1 != "" && edit2 != "")
    {
    
     MySecretCode();
    }
    else
    {
      AfxMessageBox("ich honk!");
    
    }
    
    }
    

    und du moechtes wirklich sobald man im edit feld reingeschrieben hat, dass automatisch Button2 ausgeloest wird? ne oder?



  • Die Tab-Reihenfolge hab ich schon geändert. Bringt aber nichts, da ich in OnInitDialog einen String von einer Webseite hole ("Tagestip")und den Fockus daraufgelegt habe (Durch return FALSE).
    Und ich möchte bei einigen Feldern, das das ergebnis dann ausgelöst wird, wenn man Enter drückt. Ist ziemlich sinnvoll z.B. bei nen Chatclient.
    Der User ist ja die ganze Zeit am Tippen (So wie ich jetzt) 🙂 und soll seine Eingabe nicht nur durch den Button "Senden" senden können, sondern auch durch druck der Entertaste (natürlich nur, wenn er gerade am schreiben ist und der Fokus somit auf dem Editfeld liegt.



  • Servus,

    das Beenden kannst du ja schonmal mit dem Überschreiben der Methode OnOK() verhindern.
    Einfach:

    .h

    public:
      void OnOK();
    

    .cpp

    void CDeinDlg::OnOK()
    {
     //nix
    }
    

    und schon springt er dir nicht mehr mit Return raus.

    Wenn du beim Druck von Return einen sepziellen Effekt haben willst, benutzt du am besten Accelatoren. Ist im Prinzip auch nicht schwer. Erst im Resource Editor eine Resource Accelator hinzufügen. Dann im Accelator einen neuen Punkt einfügen.
    ID: ID_ACCELATOR_RETURN, MODIFER: None, KEY: VK_RETURN, TYPE: VIRTKEY

    Dann trägst du in die .h folgendes ein:

    public:
      HANDLE m_hAccelator; //das Handle brauchst du später
      virtual BOOL PreTranslateMessage(MSG* pMsg); //brauchst du um Messages zu erkennen
    

    in die .cpp

    BEGIN_MESSAGE_MAP(CDeinDlg, CDialog)
    	ON_COMMAND(ID_ACCELERATOR_RETURN, OnReturn)
    END_MESSAGE_MAP()
    
    //In OnInitDialog
    m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR/* Die ID deiner Acceltorresource));
    
    BOOL CDeinDlg::PreTranslateMessage(MSG* pMsg)
    {
    	if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST) 
    	{ 
    		if (pMsg->wParam != VK_TAB)
    			return ::TranslateAccelerator(m_hWnd, (HACCEL__ *)m_hAccel, pMsg); 
    	}
    
    	return CDialog::PreTranslateMessage(pMsg);
    }
    
    void CDeinDlg::OnReturn()
    {
      //Mach was oder führe Senden aus
    }
    

    das wars im Prinzip. Ich bin jetzt von einem Dialog ausgegangen. Probier einfach mal ein bisschen rum und gucke bei mehr Infos in die MSDN...

    Viel Spass

    *winke*
    Hellsgore



  • @ Hellsgore,

    man, das sieht nicht schlecht aus. Respekt! 👍

    Und vielen Dank! 😃



  • return ::TranslateAccelerator(m_hWnd, (HACCEL__ *)m_hAccel, pMsg);
    

    Wofür diese komische Cast?



  • Stimmt brauchste nicht. Brauchte in meinem Projekt mal das Handle kannste einfach so machen:

    .h

    HACCEL m_hAccel;
    

    in .cpp

    BOOL CDeinDlg::PreTranslateMessage(MSG* pMsg)
    {
    	if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST) 
    	{ 
    		if (pMsg->wParam != VK_TAB)
    			return ::TranslateAccelerator(m_hWnd, m_hAccel, pMsg); 
    	}
    
    	return CDialog::PreTranslateMessage(pMsg);
    }
    

    Pferdfisch 😃

    *winke*
    Hellsgore



  • Hellsgore schrieb:

    Servus,

    das Beenden kannst du ja schonmal mit dem Überschreiben der Methode OnOK() verhindern.
    Einfach:

    .h

    public:
      void OnOK();
    

    .cpp

    void CDeinDlg::OnOK()
    {
     //nix
    }
    

    und schon springt er dir nicht mehr mit Return raus.

    Tut er doch. 😞



  • Servus,

    mhmm ehrlich? (Bei mir nicht)

    dann machs doch mit den Accelatoren damit funzt das aber...

    *winke*
    Hellsgore



  • Ich werd´s nochmal mit dem Accelator versuchen. Hat beim erstenmal auch etliche Fehler ausgeworfen (kann allerdings durchaus an mir liegen). 😞



  • Immer die Fehler beschreiben dann kann man dir Helfen.

    Ähm nur so am Rande das Bsp. von mir ist für einen stinknormalen Dialog nicht für SDI oder MDI. Dort funzt das glaube ich anders....

    *winke*
    Hellsgore



  • Das erklärt einiges.

    Ich habe ne dialogfeldbasierende Anwendung.
    Was muß man denn da anders machen.

    So bekomme ich nämlich die Fehlermeldungen:
    error C2664: 'TranslateAcceleratorA': Konvertierung des Parameters 2 von 'HANDLE' in 'HACCEL' nicht möglich
    in Zeile

    return ::TranslateAccelerator(m_hWnd, m_hAccelator, pMsg);
    

    Du hattest vorher statt m_hAccelator die Variable m_hAccel drinstehen.
    Ich gehe davon aus das das die selbe sein soll.
    Ich hab aber noch nie was von HACCEL gehört.



  • Die Var m_hAccelator sollte auch HACCEL sein. Ich hatte das in den Threads darunter geändert.

    Dann sollte es funzen *g*

    *winke*
    Hellsgore



  • Jup, jetzt funzt es 😃
    vielen Dank.


Anmelden zum Antworten