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);
    		}
    	}
    

  • Mod

    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
    }
    

  • Mod

    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!


Anmelden zum Antworten