WC_IPADDRESS
-
Hallo,
habe die Komponente WC_IPADDRESS bei mir erstellt. Es ist ein Komponente mit 4 Editfeldern zur IP Eingabe. Mein Problem ist das die einzige Botschaft die ich von dieser Komponente bekomme, die Botschaft ist wenn der Nutzer zwischen den 4 Editfeldern wechselt. Ich möchte aber gerne die Tasten TAB oder ENTER abfangen, da wenn die Komponente den Focus hat und ich Tab drücke, die Komponente immer noch den Focus besitzt. Kennt sich jemand mit den Problem aus oder hat jemand es schon mal gehabt. Wäre für Lösungsvorschläge sehr dankbar.
MfG.
-
haben deine Controls den Style WS_TABSTOP?
-
Hatte meine Frage schon mal hier gestellt, da kam ich allerdings auch nicht weiter, ein Stück Quelltext ist auch enthalten, dürfte deine Fragen klären. hier
[ Dieser Beitrag wurde am 12.06.2003 um 14:34 Uhr von e=mc² editiert. ]
-
das habe ich gerade in der MSDN gefunden:
WS_GROUP
Specifies the first control of a group of controls. The group consists of this first control and all controls defined after it, up to the next control with the WS_GROUP style. The first control in each group usually has the WS_TABSTOP style so that the user can move from group to group. The user can subsequently change the keyboard focus from one control in the group to the next control in the group by using the direction keys.Und programmierst du nun VCL oder WinApi, weil du ins VCL-Forum gepostet hast?
[ Dieser Beitrag wurde am 12.06.2003 um 15:17 Uhr von Honk editiert. ]
-
VCL mit ein wenig WinAPI.
Habe mit SetWindowLong die Botschaftsbehandlungsroutine umgeleitet und wollte damit die Nachrichten abfangen.
-
Versuch es doch einfach mal ohne WS_GROUP. Wenn die anderen Komponenten alle den WS_TABSTOP haben, sollte es theoretisch klappen.
P.S. Kann man WinApi in VCL-Code einbauen? Kenne mich da nicht aus.
-
WS_GROUP weglassen, ändert nichts.
-
Zeig mal ein minimales und kompilierbares Programm und wir lösen dein Problem...
-
Morgen Früh ca. 8:30 stellt ich den Quelltext hier rein.
-
So wie versprocher kommt jetzt Quellcode:
Erstellt erst mal ein neues Project mit den Builder.In der Project.cpp muss in der WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
INITCOMMONCONTROLSEX iccex; iccex.dwSize = sizeof(iccex); iccex.dwICC = ICC_INTERNET_CLASSES; InitCommonControlsEx(&iccex);
Das sind Globale Variablen die in Unit1 deklariert werden müssen.
WNDPROC g_wndprocOld; LRESULT CALLBACK NewWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam); HWND hWndIPAdr;
Das Nächste muss in die Unit1.cpp in Funktion
__fastcall Form1::TForm1(TComponent* AOwner) : TForm(AOwner) {
hWndIPAdr = CreateWindow(WC_IPADDRESS, //erzeugen des IP Eingabefeldes NULL, WS_CHILD | WS_TABSTOP | WS_VISIBLE , 75, 144, 95, 21, Form1->Handle, NULL,NULL, NULL); SendMessage(hWndIPAdr , WM_SETFONT, (WPARAM)(GetStockObject(DEFAULT_GUI_FONT)), MAKELPARAM(TRUE, 0)); SendMessage(hWndIPAdr , IPM_SETADDRESS, 0,MAKEIPADDRESS(192,168,0,8)); g_wndprocOld = (WNDPROC)SetWindowLong(hWndIPAdr, GWL_WNDPROC, (long)NewWndProc); //Umlenken der Winproc vom IP Eingabefeld
Das ist die neu Winproc des IP Feldes.
LRESULT CALLBACK NewWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch(iMsg){ case WM_NOTIFY: // hier kann man nur die Message IPN_FIELDCHANGED abfangen break; } return CallWindowProc((FARPROC)g_wndprocOld,hwnd,iMsg, wParam, lParam); }
hoffe das, das erst mal reicht um ein lauffähiges Prog. zu erstellen.
[ Dieser Beitrag wurde am 13.06.2003 um 09:26 Uhr von e=mc² editiert. ]
-
ich glaub das liegt daran weil du eine VCL Form benutzt
-
warum ersetzt du überhaupt die wndproc? die WM_NOTIFY nachricht kommt doch im parent fenster, also deiner form, an.
-
Das hat mit der VCL Form nichts zu tun, da die ja auch nur mit der WINAPI ein Fenster zeichnet, würde ich jetzt mal behaubten.
-
Original erstellt von e=mc²:
Morgen Früh ca. 8:30 stellt ich den Quelltext hier rein.
e=mc² erstellt 13.06.2003 09:24
So wie versprocher kommt jetzt Quellcode:Is' bei Dir Sommer-Sommer-Zeit oder was?!