CEdit SetSel()



  • Hallo und einen schönen guten Tag,

    MFC, VS2022, Windows x64

    meine Frage dreht sich um das anselektieren eines CEdit mit der Maus.

    Gegeben sei ein CEdit, in dem schon 10 Zeichen vorhanden sind.
    Nun möchte ich erreichen, dass die Maus nur die ersten 5 Zeichen markieren kann, bzw. das Caret max. bis vor dem 6. Zeichen gesetzt werden darf.

    Spy++ hat mich hier nicht unterstützen können, die Weiten des Internets brachten mir auch keine Hinweise, bis auf den Einsatz eines Hooks, der auf Bewegungen angesprochen wird.

    Gibt es vielleicht noch eine andere Möglichkeit obiges zu realisieren.

    Danke
    -Uwe


  • Mod

    Das wird schwierig. Das Edit Control sendet selbst keine Nachrichten wenn Du das Caret bewegst. Weder benutzt es EM_SETSEL um es an sich selbst zu senden, noch sendet es eine Nachricht an das Parent Fenster, solange sich nichts ändert.

    Du hättest folgende Varianten:

    1. Subclassing. Nachträglich testen.
      Sobald eine Mousenachricht oder eine Tastaturnachricht eingegangen ist, lässt Du die bearbeiten und kontrollierst danach mit EM_GETSEL, ob die Selektion noch in dem Rahmen liegt, die Du möchtest.
    2. Subclassing. Vorab testen (schwieiriger).
      Sobald eine Mousenachricht oder eine Tastaturnachricht eingegangen ist, berücksichtigst DU, was diese Nachricht tun möchte und ignorierst die, oder führst selber aus, was Du möchtest.
    3. Timer. Nicht schön.
      Du prüfst regelmäßig ob der Input im Rahmen liegt, wenn nicht korrigierst du das.
    4. Subclassing, mit einer gefakten Anzeige.
      Du übergibst nur die ersten 5 Zeichen zum editieren. Du fakest die Anzeige und zeigst rechts des Format-Rectangles einfach den Rest der Daten an. Da dieser Bereich nicht zum Edit Control gehört kann man den weder markieren noch anklicken.
    5. Du machst es nicht mit einem Edit Control, sondern mit einem Edit und einem Static Control.
      Du zeigst die ersten 5 Zeichen im Edit Control an. Plazierst ein Static Control rechts davon über dem Edit Control...

    To be continued....



  • Hallo Martin,

    vielen Dank für Deine Hilfe und Deine Gedanken zu meinem Anliegen!

    Zu 4) und 5) Das Beispiel von mir über nur die ersten 5 Zeichen selektierbar war nur der Einfachheit halber.
    Es handelt sich um ein MaskedEdit mit Literalen innerhalb des CEdit. Ich kenne die max. Position der letzten Eingabe und möchte nicht in den Freiraum zwischen Position und Literal klicken lassen. Das würde zu ungewollt ungültigen Text führen. Das passiert mir, und ich gehe von aus, das passiert anderen auch. Da es sich um Proportionalschrift handelt, macht die Sache nicht einfacher.

    Zu 3) Die App wird auf einem Terminal Server laufen. Ich weiß nicht ob viele Timer hier gut tun.

    Zu 2) Das ist das Problem, ich bekomme keine Nachrichten. Ich sehe nur den Mausklick und später die Freigabe des Mausknopfes. Was sich dazwischen abspielt? unsichtbare Stille.

    Zu 1) Diese Variante mit der nachträglichen Korrektur durch SetSel() habe ich gewählt. Zwar nicht schön, dafür selten und funktioniert.

    Danke nochmals
    -Uwe


  • Mod

    @Uwe-Heyer
    Naja zu 2.)

    • Du kannst ja die Mausnachricht (LButtonDown) komplett selber behandeln.
    • Capture setzen
    • Mausklick Position und EM_GETCHARFROMPOS benutzen.
    • Selber EM_SETSEL auslösen.

    Und nichts weitergeben...
    Gleiches mit WM_KEYDOWN...

    Dürfte eigentlich nicht schwer sein.


Log in to reply