N
CRichEditCtrl kann einen zur Verzweiflung bringen. Die bei normalen CEdit üblichen Funktionen OnSetfocus() und OnKillfocus() lassen sich per ClassWizard auch einem CRichEditCtrl zuordnen und werden auch korrekt angelegt und in der Message-Map mit ON_NOTIFY(EN_SETFOCUS,...) usw. eingetragen, werden im laufenden Programm aber nicht aufgerufen, wenn per TAB oder Mausklick zwischen verschiedenen Controls gewechselt wird.
Bei sowas wie OnUpdate_richeditctrl(), OnChange_richeditctrl() usw. wird vom ClassWizard ausdrücklich darauf hingewiesen, dass die betreffenden Messages nur verarbeitet werden, wenn bereits in OnInitDialog() per SetEventMask() diverse ENM_UPDATE/ENM_CHANGE usw. Flags an das CRichEditCtrl übergeben werden. Bei OnSet/Killfocus() ist davon nicht die Rede und irgendwelche ENM_xxx Flags, die damit zu tun haben könnten, sind in richedit.h auch nicht definiert. ENM_KEYEVENTS, ENM_MOUSEEVENTS, ENM_SELCHANGE usw. habe ich alle durchprobiert, nützen aber nichts.
Weil in diesem Anwendungsfall der Textinhalt des CRichEditCtrl auch von ausserhalb z.B. per Listenauswahl geändert wird, brauche ich eine Möglichkeit, zu erkennen wann dieses CRichEditCtrl zum Editieren aktiviert wird, um den Cursor (Caret) per SetSel() wieder korrekt positionieren zu können. Ansonsten wird unnötigerweise beim Umschalten per TAB der gesamte Text markiert bzw. beim Anklicken des Textfelds der Cursor auf die angeklickte Position gesetzt, was auch nicht erwünscht ist.
Eine Notlösung war bisher, sämtliche anderen Controls im Dialog per OnSetfocus() ihr IDC_XXX in einer Membervariablen aufbewahren und per OnKillfocus() wieder ausnullen zu lassen. Wenn dann OnMsgfilter_richeditctrl() bei irgendwelchen Maus- oder Tastaturaktivitäten kein anderes IDC_XXX vorfindet, kann die für OnSetfocus() geplante Aktion durchgeführt werden. Für OnKillfocus() funktioniert das aber eben nicht, es sei denn in OnSetfocus() eines anderen Controls. Aber dann ist es schon zu spät um die aktuelle Cursorposition im CRichEditCtrl per GetSel() abzufragen. OnSelChange_richeditctrl() ist hierfür auch nutzlos, weil's auch aufgerufen wird, wenn der Textinhalt per SetWindowText() oder UpdateData(FALSE) geändert wird und das CRichEditCtrl selbst garnicht aktiv ist. Wobei dann immer die Selektion der gesamten Textlänge incl. redundantem CrLf angegeben wird.
Langer Rede kurzer Sinn: Hat irgendwer eine Ahnung, was bei einem CRichEditCtrl wie initialisiert werden muss, damit OnSetfocus_richeditctrl() und OnKillfocus_richeditctrl() tatsächlich aufgerufen werden?
(Sämtliche vorhandenen Threads zu den Suchbegriffen "CRichEditCtrl", "SetEventMask" und "OnSetfocus" habe ich übrigens auch schon erfolglos durchgehechelt)