Probleme mit Delete

jokey2

Erfahrenes Mitglied
Hallo Gemeinde!

In meinem Projekt(VC++6; MFC) habe ich einen Accelerator mit der 'Entf'-Taste eingerichtet. Der funktioniert auch, die entsprechende Funktion wird aufgerufen.
Nun soll aber nur dann die dort implementierte Funktionalität ausgeführt werden, wenn der Focus in meinem TreeControl ist. Wenn der Fokus in einem Editfeld ist, soll die normale Funktionalität des Editfeldes ausgeführt werden, nämlich das Zeichen rechts neben dem Cursor löschen.
Nun die Frage: Welche Nachricht muß ich an das Editfeld senden, um das zu erreichen? WM_CLEAR löscht ja nur die markierten Zeichen. Wenn also nichts markiert ist, dann passiert auch nichts. Gibt es eine entsprechende Nachricht oder muß ich das selber nachbilden, indem ich das Zeichen rechts neben dem Cursor markiere und dann WM_CLEAR sende?
 
Eine der grossen Schwächen der Edit-Control, etwas programmtechnisch am Inhalt verändern.

Ich würde in dem Fall so weit gehen, und den Accelerator durch ein PreTranslateMessage ersetzen. Was auch immer du machst, du wirst dir ein Bein samt künstlichem Hüftgelenk ausreissen müssen, um das Eingabeverhalten der Edit wieder genauso hinzukriegen, als ob der Accelerator da nichts tun würde (ich denke da an Cursor-Position und Selektion).
Die Acceleratoren sind meines Erachtens nach nur wirklich sinnvoll einzusetzen, wenn sie mit Ctrl und/oder Shift und/oder Alt verknüpft sind und keine der Standard-Windows-Tastenkombinationen darstellen.

Es dürfte einfacher sein, in PreTranslateMessage auf ein WM_KEYDOWN zu prüfen, und wenn der Focus auf dem Edit liegt, einfach nichts zu tun.
 
Das ginge natürlich auch. Momentan habe ich es erstmal so gelöst:
Code:
	CWnd * pWnd = CWnd::GetFocus();
   	if(pWnd == NULL)
   		return;
   	CRuntimeClass *pRC = pWnd->GetRuntimeClass();
   
   	if(strcmp(pRC->m_lpszClassName, "CEdit") == 0)
   	{
   		CEdit * pEdit = (CEdit*)pWnd;
   
   		pEdit->GetSel(iStart, iEnd);
   		if(iStart == iEnd)
   		{
   			iEnd++;
   			pEdit->SetSel(iStart, iEnd, TRUE);
   		}
   		pEdit->SendMessage(WM_CLEAR);
   	}
   	else if(strcmp(pRC->m_lpszClassName, "CLeftView") == 0)
   	{
   		// do special stuff
   	}
Bisher klappt das ganz gut. Wenn's doch noch Probleme gibt, nehme ich gerne Deinen Vorschlag.
 
Zurück