tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
1192
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von anmae
    anmae anmae ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Ort
    Chemnitz
    Beiträge
    203
    Hallo,

    ich habe eine gut gefüllte Combo Box und möchte beim schreiben in das Edit Feld der Box den nächst passenden Eintrag selektieren.
    Soweit sogut.

    Ich habe allerdings das Problem, das ich - wenn ich z.b. Backspace drücke die Markierung gelöscht bekomme und diese gleichzeitig wieder gefüllt wird -- also nichts passiert. mit GetEditSel greife ich irgendwie immer ins leere, desshalb frage ich euch mal wie ich das abfangen kann.


    Danke schonmal.
    Hier mein Code:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    void CMonitorDlg::OnEditchangeVarNamen() 
    {
        CString edit;
        mc_var_Name.GetWindowText(edit);
        
        int length=0;
        if((length = edit.GetLength())>0){
            if( mc_var_Name.SelectString(-1, edit) == CB_ERR){
                mc_var_Name.SetWindowText(edit);
                mc_var_Name.SetEditSel(length,-1);
            }
            else{
                CString selectetVar;
                mc_var_Name.GetWindowText(selectetVar);
                int length2 = selectetVar.GetLength();
                mc_var_Name.SetEditSel(length,length2);
            }
        }
    }
     

  2. #2
    Avatar von anmae
    anmae anmae ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Ort
    Chemnitz
    Beiträge
    203
    Es würde ja reichen die zu letzt eingegebene Taste abzufangen. Also wenn backspace oder Entfernen gedrückt wurde dann halt nicht Find() aufrufen.

    Wie komme ich denn an die letzte Tastatureingabe?
     

  3. #3
    Avatar von anmae
    anmae anmae ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Ort
    Chemnitz
    Beiträge
    203
    Die Message WM_KEYDOWN geht ja irgendwie nur für den gesamten Dialog und nicht das Combofeld.
    Ich habe die OnKeyDown() Methode mit dem Wizard eingefügt, die wird aber irgendwie nicht aufgerufen!?
    Gibt es keine Methode des Combofeldes mit der ich die Tastatureingabe auslesen kann oder eine Funktion die ich in der OnEditChange aufrufen kann und die mir die letzte Eingabe zurückgibt?
     

  4. #4
    langer1801 langer1801 ist offline Mitglied Platin
    Registriert seit
    Jun 2005
    Ort
    Bad Arolsen (Hessen)
    Beiträge
    556
    In den direkten Funktionen für die ComboBox gibts da wohl nichts. Ich würde mal in der Dialogklasse die Funktion PreTranslateMessage überschreiben, die WM_KEYDOWN-Message abfangen und da auf den Tasten-Code Backspace usw. prüfen. Vielleicht gehts so.

    Mfg

    langer
     

  5. #5
    langer1801 langer1801 ist offline Mitglied Platin
    Registriert seit
    Jun 2005
    Ort
    Bad Arolsen (Hessen)
    Beiträge
    556
    Vielleicht wäre es auch besser, einen eigene Klasse von CComboBox abzuleiten und da die Funktion OnKeyDown zu überschreiben. Dann wäre man sicher, nur die Meldungen zu erhalten, die wirklich die Combobox betreffen.

    langer
     

  6. #6
    Avatar von anmae
    anmae anmae ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Ort
    Chemnitz
    Beiträge
    203
    ok, ich habe nun die PreTranslateMessage.
    Wie kann ich testen ob die Message für mein Combo bestimmt ist?

    ich habs so versucht:

    if(pMsg->hwnd == mc_var_Name.m_hWnd ) ...

    geht nich!
    Geändert von anmae (27.09.05 um 13:45 Uhr)
     

  7. #7
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Ich glaube, pMsg->hwnd enthält immer nur den Fensterhandle für den Dialog.
    Du könntest aber abprüfen, ob deine Combobox den Eingabefokus hat:
    Code :
    1
    2
    3
    4
    5
    6
    7
    
    if( pMsg->message == WM_KEYDOWN )
    {
        if( ::GetDlgCtrlID(::GetFocus()->m_hWnd) == IDC_MYCOMBOBOX )
        {
            //...
        }
    }
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  8. #8
    Avatar von anmae
    anmae anmae ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Ort
    Chemnitz
    Beiträge
    203
    Danke erstmal,

    Bei deiner Variante bekomme ich den Fehler:
    m_hWnd' : Ist kein Element von 'HWND__'

    desshalb hab ich es so versucht:

    Code :
    1
    2
    
        CWnd* wnd = this->GetFocus();
           if( ::GetDlgCtrlID(wnd->m_hWnd) == IDC_COMBO_VARNAME )

    Der Test klappt aber nie.
     

  9. #9
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Sorry, der "::"-Scope bei GetFocus() war natürlich falsch und das pMsg->hwnd nur den Fensterhandle für den Dialog enthält stimmt auch nicht .

    Das Problem liegt darin, dass das Edit-Feld ein eigenes Control darstellt, mit eigener ID und eigenem Fensterhandle. Diese ID ist zum Glück immer dieselbe, so dass folgende Abfrage funktionieren sollte;
    Code :
    1
    2
    3
    4
    
    if( pMsg->hwnd == mc_var_Name.GetDlgItem(1001)->GetSafeHwnd() )
    {
        //...
    }
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

Ähnliche Themen

  1. Combo-Box Icon
    Von Sneakers im Forum Java
    Antworten: 1
    Letzter Beitrag: 25.11.07, 00:21
  2. Combo box
    Von Fr3dd1 im Forum Visual Basic 6.0
    Antworten: 21
    Letzter Beitrag: 09.06.06, 20:28
  3. Combo Box
    Von WIldi im Forum VisualStudio & MFC
    Antworten: 3
    Letzter Beitrag: 20.09.04, 12:43
  4. Combo-Box
    Von Stephan Boettcher im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 28.06.04, 19:03
  5. Combo box****?
    Von Devil im Forum Flash Plattform
    Antworten: 3
    Letzter Beitrag: 08.10.01, 21:09