Mehrzeiliges Editfeld leeren
-
Hallo mal wieder,
ganz simples Problem:
Ein mit ES_MULTILINE erzeugtes Editfeld soll geleert werden.
Doch mit SetWindowText(hEdit,NULL) werden Zeilenbrüche nicht ausradiert.
Wie leer ich das ganz?
lg Max
-
SetWindowText(hEdit, TEXT(""));
-
WinNT.h
[...]
#define __TEXT(quote) quote // r_winnt
[...]
#define TEXT(quote) __TEXT(quote) // r_winnt
[...]
Sollte heißen TEXT("") ist identisch mit "".
Wofür gibts sowas dann?Danke aber das funktioniert leider genauso wenig ...
Ich habe immernoch meine Zeilenumbrüche im hEdit ...
lg Max
-
SendMessage(hWndEdit, EM_SETSEL, 0, -1); SendMessage(hWndEdit, EM_REPLACESEL, FALSE, (LPARAM) _T(""));
-
TEXT ist ein Makro was -bei Compilierung mit UNICODE- ein 'L' vor Deinen String setzt. Das sorgt dafür, dass Dein Compiler diesen als wchar_t-C-String interpretiert. Macht also Sinn, weil man dann einfach zwischen dem Zeichensatz wechseln kann.
SetWindowText(hEdit, NULL); ist eigentlich richtig, zeig mal Deinen Code. Ist hEdit evtl. nicht mehr gültig (Standardfehler
)? Hast mal den Return-Wert und ggfs. GetLastError geprüft?@sri: Komplizierter geht es eigentlich auch net^^.
-
WNDPROC EditProc; LRESULT CALLBACK WndEdit(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { static klasse* instanz = 0; if (instanz == 0) instanz = (klasse*)GetWindowLong(hWnd,GWL_USERDATA); if (msg == WM_KEYDOWN && wParam == VK_RETURN) { if (GetAsyncKeyState(VK_CONTROL) & (1 << 15)) { //verarbeite Text aus hEdit (GetWindowText() usw ...) und dann: SetWindowText(instanz->hEdit,NULL); //NULL oder TEXT("") oder nur "", einerlei ... } } return CallWindowProc(EditProc,hWnd,msg,wParam,lParam); } LRESULT CALLBACK WndMain(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { static klasse* instanz = 0; if (msg == WM_CREATE && instanz == 0) instanz = (klasse*)LPCREATESTRUCT(lParam)->lpCreateParams; if (msg == WM_CREATE) { instanz->hEdit = CreateWindow("EDIT",NULL,WS_CHILD|WS_VISIBLE|ES_MULTILINE|WS_VSCROLL|ES_AUTOVSCROLL,10,10,200,100,hWnd,NULL,hInst,NULL); SetWindowLong(instanz->hEdit,GWL_USERDATA,(long)LPVOID(instanz)); EditProc = (WNDPROC)SetWindowLong(instanz->hEdit,GWL_WNDPROC,(long)WndEdit); } return DefWindowProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam); } int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { klasse instanz; instanz.hEdit = 0; // HWND klasse::hEdit HWND hWnd = CreateWindow("MAIN","juhu",WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN,100,100,600,450,NULL,NULL,hInstance,&instanz); // Nachrichten-Verarbeitung }Wenn Ihr folgen konntet, so sehr Ihr, dass hEdit im Subclassing ist und bei der Tastenkombination STRG+ENTER den Text verarbeitet und dann das Textfeld wieder leert - bzw nicht ganz, weil eben immer ein Zeilenumbruch drin bleibt.
Hm ... mit dem Satz hab ich mir grad selbst was beantwortet.
^^Wie ich sagte bleibt ein Zeilenumbruch im Edit, dh es ist naheliegend, dass erst alles rausradiert wird und danach - obwohl VK_RETURN abgefangen wurde - der durch ENTER erzeugte Zeilenumbruch ins Editfeld geschrieben wird.Sry, mir fällt auf, dass das mit SetWindowText() nichts zu tun hat ... ^^
Die Frage ist jetzt dann wohl folgende:
Ich habe VK_RETURN erfolgreich abgefangen, wie kann ich jedoch verhindern, dass der normalerweise durch VK_RETURN erzeugte Zeilenumbruch nicht mehr geschrieben wird?
Danke schonmal für Eure Hilfe!
lg Max
-
CodeFinder schrieb:
@sri: Komplizierter geht es eigentlich auch net^^.
War als Alternative gedacht, da SetWindowText ja angeblich nicht ging.
-
Jep, danke dafür

lg Max
-
Ok ich frag nochmal ganz explizit ohne Code - da muss es doch eine Lösung geben ...
Folgendes:
Ich habe mit SetWindowLong mein HWND hEdit gesubclassed und fange in der WNDPROC die Taste Enter (VK_RETURN) ab. Allerdings wird der Zeilenumbruch trotzdem in mein Editfeld geschrieben.
Wie kann ich das verhindern?
lg Max
-
Im obigen Codeschnipsel leitest Du den Tastendruck nach der Bearbeitung trotzdem an die Standardfenster-Prozedur weiter. In diesem Fall besser 0 zurückgeben.
-
Schöne Idee, helfen tuts leider aber auch nicht ...

Eigentlich könnte die Frage auch so lauten:
Wie ignoriert man Tasten in einem Edit-Window, so dass sie nicht geschrieben werden?
lg Max
-
WM_CHAR
-
Interessant, das funktioniert sogar schon fast:
if (msg == WM_CHAR && wParam == VK_RETURN) { return 1; //Zeilenumbruch verwerfen }Nun tippe ich Enter und es passiert nichts - sehr schön!
Allerdings möchte das Ganze ja gern in Verbindung mit der Strg-Taste (VK_CONTROL) realisieren und das gestaltet sich noch schwierig.if (msg == WM_CHAR && wParam == VK_RETURN && KEYDOWN(VK_CONTROL)) { return 1; //Zeilenumbruch verwerfen }Mein KEYDOWN()-Makro:
#define KEYDOWN(id) (BOOL)(GetAsyncKeyState(id)&(1<<15))Wenn ich nun Strg+Enter drücke, springt meine If-Anfrage nicht an.
Mit WM_KEYDOWN hat KEYDOWN() funktioniert.
Bitte um Hilfe.
lg Max
-
Da muss es doch eine Lösung geben ... ?
lg Max
-
MaDsTyLe schrieb:
Wie ignoriert man Tasten in einem Edit-Window, so dass sie nicht geschrieben werden?
Verwende EN_UPDATE

Wie wärs mit ein bißchen Forumsuche? Z.B.:
"Editbox: nur Hexadeziamlzahlen" http://www.c-plusplus.net/forum/viewtopic-var-t-is-214527.html
Du mußt Dich erstmal für ein Konzept entscheiden: Entweder läßt Du nur solche Tastatur-Eingaben zu die zulässig sind oder filterst eben solche raus die unerwünscht sind.Ein Riesenvorteil meiner Methode gegenüber Tastatur-Auswertungen á la WM_CHAR oder WM_KEYDOWN ist, daß sie auch bei Drag&Drop oder Copy&Paste (also keine Tastatureingaben!) funktionieren

Martin
-
MaDsTyLe schrieb:
#define KEYDOWN(id) (BOOL)(GetAsyncKeyState(id)&(1<<15))Das ist Unsinn, es muss GetKeyState verwendet werden.
Unter schwerer Last würde GetAsynchKeyState bereits melden, das eine Taste nicht mehr gedrückt ist, obwohl sie zu der Zeit der erzeugtem WM_CHAR Nachricht gedrückt war.Lies mal bitte:
http://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms646293(VS.85).aspxIrgendwann hat irgendein Mensch angefangen einen Tipp mit GetAsynchKeyState zu geben und dieser Unsinn kursiert nun auf ewig durch die Netze...
-
Danke, aber was bedeutet "Unter schwerer Last" konkret?
lg Max
-
Wenn Windows sehr stark unter Last steht (100 CPU Auslastung) kann man bei dem Bearbeiten von Tastaturbefehlen oft einen starken Nachlauf festestellen.
D.h. man Tippt Tasten und es dauert Sekunden bis die Tasten einlaufen...
In solchen Fällen würde GetAsnchKeyState versagen, oder zu wirklich ungewollten Funktionen führen.