Tastatureingaben in Listenfeld
-
Hi,
ich habe in meinem Dialog ein Listenfeld, daneben mehrere Buttons zum Einfügen, Bearbeiten, Löschen der Listeneinträge. Ich möchte nun erreichen, dass man mit Enter einen markierten Eintrag anzeigen kann (also eine bestimmte Funktion aufruft), und nicht der Standardbutton betätigt wird. Wie kann ich die Reaktion des Listenfelds auf das Drücken von Enter ändern, aber die bisherigen Funktionen beibehalten (z.B. das standardmäßige Springen zum Eintrag mit dem Anfangsbuchstaben, den man eingegeben hat)?
-
Durch Subclassing:
WNDPROC oldproc; orgproc = (WNDPROC)GetWindowLong(hwndlist, GWL_WNDPROC); SetWindowLong(hwndlist, GWL_WNDPROC, (long)newproc); int _stdcall newproc(HWND hwnd, unsigned int message, unsigned int wParam, long lParam) { switch(message) { case WM_CHAR: if (wParam == VK_RETURN) { DoSth(); return 0; oder break; } break; } return CallWindowProc(oldproc, hwnd, message, wParam, lParam); }
-
_stdcall
__stdcall
.
-
Die moderne Funktion ist SetWindowLongPtr().
-
Und statt long dann auch bitte LONG_PTR, sonst bringt SetWindowLongPtr auch nix :p .
-
Ich denke, wenn man eine neue Funktion gegeben kriegt, schaut man erstmal in der Doku nach und sieht so auch, was für Typen die Parameter haben...
-
Dann hätte er auch LONG verwendet.
-
Merke: keksekekse != Tlyman
-
Merke: Mein Post hat sich auch an keksekekse gerichtet

-
Hey cool, danke für das Beispiel! Die richtigen Typen usw. suche ich mir schon raus, hier war eigentlich Subclassing das wichtige Stichwort für mich. Ich hatte mal kurz drüber gelesen, hab aber nicht gewusst, dass es in diesem Zusammenhang hilfreich ist.
Dankeschön an euch alle!
-
Leider musste ich feststellen, dass mein Problem etwas komplexer ist. Mein Hauptfenster ist nämlich der erwähnte Dialog, d.h. ich erstelle ihn mit CreateDialog (). Da er somit modeless ist (sorry, kenn das deutsche Wort nicht), lasse ich das dialogtypische Verhalten (also die bekannten Tastatureingaben wie Tab, die Mnemonics, usw.) mit IsDialogMessage verarbeiten. Daher wird die Enter-Taste (die ich ja abfangen wollte) schon von IsDialogMessage verarbeitet und anscheinend nicht weitergeleitet. Ich habe herausgefunden, dass ich das mit Abfangen von WM_GETDLGCODE verhindern kann. Jetzt bin ich mir aber nicht ganz sicher wie ich das benutzen soll.
In meiner NewListProc habe ich:switch (message) { case WM_GETDLGCODE: if (lParam) { p_msg = (LPMSG) lParam; if (p_msg->message == WM_CHAR && p_msg->wParam == VK_RETURN) { ZeigeDatenAn (); return DLGC_WANTCHARS; } } return CallWindowProc (OldListProc, hwnd, message, wParam, lParam); }Beim Debuggen habe ich festgestellt, dass WM_CHAR auch tatsächlich abgefangen wird, aber ausgerechnet nicht bei Eingabe von Enter.
Hat jemand eine Ahnung, warum Enter eine "Sonderstellung" hat, oder was ich da falsch gemacht habe?