Inhalt einer EditBox automatisch auswählen bei Mausklick in das Feld
-
Hi Leute,
ich bräuchte mal Eure Hilfe zwecks Editboxen. Und zwar brauche ich unbedingt Editboxen, bei denen der Inhalt bei Mausklick oder per Tabstop in das Editfeld markiert wird und auch bleibt. Gibt es da eine Möglichkeit? Habe in den Properties der Boxen nur sowas wie NoHideSlekt gefunden. Damit bleibt der Inhalt des Feldes zwar dauerhaft markiert, aber wenn ich rein klicke ist die Markierung weg. Kann mir jemand helfen?Vielen Dank schon mal.
-
eugler schrieb:
Und zwar brauche ich unbedingt Editboxen, bei denen der Inhalt bei Mausklick oder per Tabstop in das Editfeld markiert wird und auch bleibt.
Wenn Du ganz normale Edit Controls verwendest, dann machen sie das auch genau so. Hast Du vielleicht die Doku von MSDN dazu gelesen?
"About edit controls" http://msdn2.microsoft.com/en-us/library/bb775456(VS.85).aspxeugler schrieb:
Habe in den Properties der Boxen nur sowas wie NoHideSlekt gefunden.
Das klingt aber nicht nach reinem WinAPI. Ist es vielleicht MFC?
Wir müssen das vorher wissen, bevor wir Dir die richtigen Hinweise geben können.eugler schrieb:
Damit bleibt der Inhalt des Feldes zwar dauerhaft markiert, aber wenn ich rein klicke ist die Markierung weg.
Dieses Verhalten ist normaler Standard.
Habe ich das so verstanden, daß die Markierung IMMER bestehen muß, also auch nach dem x-ten Mausklick?
Ist es Dir auch bewußt, daß der User den markierten Text dann gar nicht mehr ändern kann, nur noch löschen und komplett neu eingeben?Martin
-
Sorry, stimmt nicht ganz 100%ig... beim ersten Klick mit der Maus aufs Edit-Feld wird der Text nicht selektiert. Aber bei Wechsel mit der Tab-Taste wird der Text gleich mit selektiert.
Prinzipielle Vorgehensweise um ein Text zu selektieren:
Mit EN_SETFOCUS bekommst Du eine Nachricht wenn der User ein neues Edit-Feld gewählt hat.
Dann mit EM_SETSEL den Text selektieren.HTH,
Martin
-
Erstmal vielen Dank für die schnelle Antwort. War gerade beim Antworten als ich die Benachrichtigung über Deinen neuen Beitrag bekommen hab. :p
Sicher habe ich die MSDN-Hilfe gelesen, aber da steht ja, wie Du bemerkt hast, "When it is selected, an edit control displays a blinking caret that indicates the insertion point.".
Es handelt sich rein um WinAPI.Es geht halt darum, dass der Benutzer nicht genötigt wird, erst per backspace den Inhalt des EditControls zu löschen oder mit der Maus zu markieren, bevor er eine neue Eingabe macht. Er soll in das Feld klicken und dann einfach Werte eingeben können, die dann die alten überschreiben.
Danke für den Tip, ich werde mir das mal anschauen.
thnx & greetz
-
eugler schrieb:
Habe in den Properties der Boxen nur sowas wie NoHideSlekt gefunden.
Aus reiner Neugier: Wo ist diese Einstellung zu finden bzw. wo sind diese Properties erreichbar?
Unter Google habe ich unter NoHideSlekt (oder wahrscheinlich korrekt so: NoHideSelect?) nichts passendes gefunden.Martin
-
hi martin,
also ich arbeite mit vs8 und wenn man dort mit dem ressoucen-manager sich seine dialoge zusammenbastelt, dann kann man sich die (über rechtskick > properties) die eigenschaften der einzelnen elemente anzeigen lassen und einstellen. da gibts ne ganze latte von eistellungen, aber leider nicht die, die ich bräuchte.
hast du evtl ein kleines codefragment, wie ich den gesamten text markiere? hatte eigentlich gedacht, dass es mit
SendMessage(hWnd, EM_SETSEL, 0, -1);
im case des jeweiligen edit-control gehen muesste, das tuts aber leider nicht.
gruss
-
Wie emöchtest Du bitte behandeln, dass der Nutzer einen Text markiert mit der Maus?
Sicherlich kanst Du ein WM_LBUTTONDOWN abfangen (nicht weiterleiten) und dann EM_SETSEL ausführen. Ob das aber ist was der User will?
Ansonsten wird in einem Dialog grundsätzlich beim Aktivierung eines Edit Controls der gesamte Text markiert. Das mach IsDialogMessage mit Nachfrage WM_GETDLGCODE...
-
also das kling doch so, als ob es völlig normal wäre, dass beim aktivieren - für mich heisst das anwählen auch mit der maus- ein edit controls der text selektiert wird. ist doch aber nicht so. zumindest bei mir nicht. ich will ja nicht unbedingt, das über die maus machen, das ist egal. ich werde mal IsDialogMessage erforschen.
thnx
-
SendMessage(hWnd, EM_SETSEL, 0, -1);
Das ist schon richtig so, um den gesamten Text im Edit Control zu markieren.
Wenns trotzdem nicht funktioniert, dann kann es wahrscheinlich nur daran liegen, daß hwnd nicht das richtige Handle hat?
Korrekt muß es prinzipiell so sein (ich gehe davon aus, daß Du ein Dialog gebaut hast):
HWND hwnd_control; HWND hwnd_dialog; hwnd_control = GetDlgItem( hwnd_dialog, ID_EDITFELD ); SendMessage( hwnd_control, EM_SETSEL, 0, -1 );
wobei hwnd_control das Handle des Edit controls, und
hwnd_dialog das Handle des Dialogs ist.Wichtig zu wissen: Jeder Dialog und jedes Control (also auch Buttons, Editfelder usw.) ist auch ein Fenster! Nämlich als Parent- und Child-Fenster.
Martin
-
vielen dank für die tips, aber irgendwie bekomme ich es nicht hin, die gewünschte selektion bleibt aus. habs jetzt so versucht:
[cpp]LRESULT CALLBACK DlgSetup2Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
[...]
HWND hWnd_Height;
HWND hwnd_Dialog;switch(uMsg)
{
case WM_INITDIALOG:
[...]
return TRUE;case WM_COMMAND:
switch(LOWORD (wParam))
{
case IDC_HEIGHT: //Height of Fieldhwnd_Height = GetDlgItem( hwnd_Dialog, IDC_HEIGHT );
SendMessage( hwnd_Height, EM_SETSEL, 0, -1 );[...]
break;[/cpp]was mache ich falsch?
greetz
-
In Deinem Fall ist hwnd, also der erste Übergabeparameter an Callback-Prozedur DlgSetup2Proc(), der von mir erwähnte hwnd_dialog.
Daher Korrektur wie folgt:
LRESULT CALLBACK DlgSetup2Proc(HWND hwnd_dialog, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
[...]
HWND hWnd_Height;
//HWND hwnd_Dialog; //Diese Zeile entfernen!!switch(uMsg)
{
case WM_INITDIALOG:
[...]
return TRUE;case WM_COMMAND:
switch(LOWORD (wParam))
{
case IDC_HEIGHT: //Height of Field
hwnd_Height = GetDlgItem( hwnd_dialog, IDC_HEIGHT );
SendMessage( hwnd_Height, EM_SETSEL, 0, -1 );[...]
break;Innerhalb des WM_COMMAND wertest Du hoffentlich auch das EN_SETFOCUS aus, oder nicht?
Auszug aus MSDN: The user makes editing requests by using the keyboard and mouse. The system sends each request to the edit control's parent window (das ist hwnd_dialog) in the form of a WM_COMMAND message. The message includes the edit control identifier in the low-order word of the wParam parameter, the handle of the edit control in the lParam parameter (dieser wäre mit Inhalt von hwnd_Height identisch, d.h. in diesem Fall wäre GetDlgItem() überflüssig), and an edit control notification message corresponding to the user's action in the high-order word of the wParam (hier checkst Du auf EN_SETFOCUS) parameter. An application should examine each notification message and respond appropriately.Martin