IsDialogMessage und Multiline-Edits
-
Hi Leute!
Ich habe ein Problem mit IsDialogMessage und Editboxen mit dem ES_MULTILINE-Stil.
Ich habe alle Fenster bis auf "static"s (für Texte) und "edit"s mit ES_MULTILINE-Stil den zusätzlichen Stil "WS_TABSTOP" gegeben, damit ich mit TAB die einzelnen Elemente durchsteppen kann. Das geht wunderbar.
Ein doofer Nebeneffekt dabei ist, dass ich nicht mehr einen Absatz, geschweige einen Tabulator in Edits mit ES_MULTILINE setzen kann! Kurz: Das ES_MULTILINE ist keine Multiline dadurch mehr sondern eine Singleline
Gebe ich diesen Editboxen auch einen WS_TABSTOP als zusätzlichen Stil, dann geht es auch nicht.Hier meine Hauptschleife:
while (GetMessage (&message, nullptr, 0, 0)) { if (!IsDialogMessage (hwnd, &message)) { TranslateMessage (&message); DispatchMessage (&message); } }Jemand eine Idee?
-
Am besten baue dir ein Accelerator mit TAB key, dann in WM_COMMAND ...
case WM_COMMAND: if (wParam == IDC_ACCELL_TAB) { if (GetFocus() == hwndEditBox) { SendMessage(hwndEditBox, EM_REPLACESEL, TRUE, (LPARAM)TEXT("\t")); } else { // forward keystoke to focused window oder IsDialogMessage } }Option 2: Subclassing + WM_GETDLGCODE -> return DLGC_WANTALLKEYS;
Option 3:
while (GetMessage (&message, nullptr, 0, 0)) { if ((message.message is WM_KEYDOWN, WM_KEYUP or WM_CHAR) && (message.wParam == VK_TAB) && (GetFocus() == hwndEditBox)) { TranslateMessage(&message); DispatchMessage(&message); } else if (!IsDialogMessage(hwnd, &message)) { TranslateMessage(&message); DispatchMessage(&message); } }
-
Möglichkeit 1: Führe IsDialogMessage nicht aus, wenn das Edit Control den Focus hat. (Ich würde es etwas anders machen als Sapero)
Möglichkeit 2: Weitaus besser. Benutze Strg+Tab!
-
Hmn, alle hier geposteten Möglichkeiten setzen voraus, das ich das Handle von allen Multiline-Edits fest in der Hauptschleife verankere. Da es sich dabei um MDIs mit mehrere Multiline-Edits handelt macht die Sache auch nicht gerade einfacher.
STRG+TAB benutze ich schon um bei Reitern durchzusteppen. Dazu habe ich noch nie gesehen, dass STRG+TAB benutzt wird um zwischen Feldern zu steppen?!
-
Nein, brauchst du nicht, die Klassenname ist gleich:
HWND focus = GetFocus(); BOOL isdialog = (focus && GetClassName(focus, szName, szName_cch) && !lstrcmpi(szName, TEXT("edit"))); if (!isdialog) { isdialog = IsDialogMessage() } if (!isdialog) { translate & dispatch }
-
Strg+Tab meinte ich um ein TAB einzugeben.
@sapero: Die Klasse alleine genügt nicht. Man müsste hier auch den Stil prüfen um zu erkennen, dass es ein MultiLineEdit Ctrl ist.
-
@ Martin Richter
CTRL+TAB zum eingeben eines Tabs ist doch Murks und nur eine zusammengeschusterte Lösung!@sapero
Danke! Ich nehme diese Lösung und prüfe noch wie Martin gesagt hat nach dem Stil und habe ruhe
Dank dir!