Combo Box

anmae

Erfahrenes Mitglied
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:
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);
		}
	}
}
 
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?
 
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?
 
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
 
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
 
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!
 
Zuletzt bearbeitet:
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:
if( pMsg->message == WM_KEYDOWN )
{
    if( ::GetDlgCtrlID(::GetFocus()->m_hWnd) == IDC_MYCOMBOBOX )
    {
        //...
    }
}
 
Danke erstmal,

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

desshalb hab ich es so versucht:

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

Der Test klappt aber nie.
 
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:
if( pMsg->hwnd == mc_var_Name.GetDlgItem(1001)->GetSafeHwnd() )
{
    //...
}
 
Zurück