WM_CHAR und Editfelder



  • Ich hänge gerade etwas an zwei ziemlich ähnlichen Problemen.
    Im Grunde versuche ich beide Male eine Methode aufrufen zu lassen, wenn der Benutzer etwas in ein Edit-Feld eingibt.

    Leider handelt es sich nicht um schlichte CEdits sondern im ersten Fall um ein CMFCPropertyGridCtrl
    und im zweiten Fall um ein CMFCRibbonEdit.

    Ich hoffe, dass es für beides eine bessere Lösung gibt, als das Einzige was mir einfällt.

    Am Besten ich erklär mal, wo genau das Problem liegt und was ich eigentlich suche. (Problem und Ziel)
    Meine Lösungsansätze gefallen mir irgendwie nicht wirklich. 😕

    Problem 1:
    Im Ribbonbar des Mainframes habe ich ein CMFCRibbonEdit angebracht bei dem den User einen Filterwert eintippen lassen will.
    Bei jeder Änderung in diesem Feld wird bei den verschiedenen ListViews die Liste nach dieser Eingabe gefiltert.
    Mein Ziel war es im Doc den aktuellen Filterwert zu erfassen, aber ich habe nichts rausgefunden, wie ich die
    WM_CHAR Message dort erwischen könnte. Oder eine ähnlich hilfreiche Message.
    Das einzige wäre über WM_COMMAND, die aber nur gefangen wird, wenn der Benutzer die Eingabe völlig beendet hat.
    (Also das Editierfeld verlässt)

    Das einzige was mir eingefallen wäre, ist ein eigenes RibbonEdit zu schreiben. Von CMFCRibbonEdit abgeleitet sollte man
    dort die WM_CHAR Message erwischen. Dann halt eine eigene Message verschicken und die dann vom Document abgreifen. 😕

    Ziel 1:

    class MyDoc : public CDocument
    {
    	[...]
    
    	// Wird aufgerufen, wenn im CMFCRibbonEdit der Wert geändert wird.
    	... OnRibbonEditFieldChanged(...);
    
    	[...]
    
    }
    

    **
    Problem 2:**
    Ich möchte die Eingabe in ein PropertyGridCtrl bei jeder Änderung überprüfen.
    Dazu habe ich eine Klasse davon ableiten lassen und wollte eine Methode aufrufen lassen, wenn eine Eingabe gemacht wird.
    Das gleiche Problem, keine passende Message. 😕
    Es gibt eine überschreibbare Methode EditItem die aber nur aufgerufen wird, wenn _angefangen_ wird etwas einzugeben.
    Bringt also nicht so viel.
    Eine andere Möglichkeit wäre EndEditItem, die aber keine Information darüber kriegt, welche Property geändert wurde.
    Das heisst ich müsste immer gleich alle überprüfen. Auch schlecht.

    Die gleiche Lösung wie bei Problem 1 wäre dann wieder von der Klasse abzuleiten, welche die WM_CHAR Message bekommt.
    Das gäbe in diesem Fall aber bereits eine Kette...

    In meinem MyPropertyGridCtrl müsste ich ändern, dass statt CMFCPropertyGridProperty eine eigene Property benutzt wird
    die dann wiederum statt CEdit mein eigenes Edit benützt.

    CMFCPropertyGridCtrl  --> CMFCPropertyGridProperty  -->  CEdit
             :                          :                       :
     MyPropertyGridCtrl   -->   MyPropertyGridProperty  -->  MyEdit
    

    MyEdit mit ON_CHAR in der Message-Map.

    Ziel 2:

    class MyPropertyGridCtrl : public CMFCPropertyGridCtrl
    {
    	[...]
    
    	// Wird aufgerufen, wenn der Benutzer einen Wert von diesem PropertyGrid-Control ändert.
    	... OnPropertyValueChanged(...);
    
    	[...]
    }
    

    Was würdet ihr versuchen? :-s Ich bin für jeden Hilfeversuch sehr dankbar! o.o


  • Mod

    Es ist unsinnig die WM_CHAR Nachricht wonders zu bearbeiten.
    Ich würde es so mache.
    1. Das Edit COntzrol wird geändert.
    2. Der Container, der das Edit Control enthält, bestimmt das aktuelle Document und sendet diesem eine Notification, oder ruft eine spezielle Funktion auf. Am einfachsten ist es eine WM_COMMAND Nachricht an das Framne zu senden und im Dokument einen Handler einzubauen, der die Benachrichtigung abarbeitet.
    3. Das Dok (evtl. besser der View) bekommt die Benachrichtigung, besorgt sich die neuen Filterdaten und ändert die Anzeige.



  • Ok, Danke Martin 🙂
    Ich dachte bevor ich jetzt die ganzen Klassen ändere (RibbonEdit, PropertyCtrl, Property, Cedit) frag ich hier mal nach, ob's ne bessere Lösung gibt.

    Tja, ärmel hochkrempel mal ranklotzen.


  • Mod

    Wieso musst Du die ganzen Klassen ändern?
    Du musst doch nur die Container anpassen und dass ist doch normal...



  • hmm.. der Container der das Edit-Control enthält ist im Problem 1 wohl das Ribbon-Edit.
    Im Zweiten dann ist das wohl die GridProperty. Dazu muss ich noch das GridPropertyCtrl ändern, damit ich auch ein Control hab welches meine angepasste GridProperty benutzt.
    Das CEdit zum abfangen von WM_CHAR.

    *grübel* Oder seh ich was falsch?


  • Mod

    Nein! Ichmeine nicht die abgeleitete Klasse, sondern das echte Elternfenster, dass auch die EN_CHANGE Notifications bekommt.



  • Ah, cool. Mit EN_CHANGE muss ich also das CEdit gar nicht ändern, sondern kann direkt in meinen abgeleiteten Klassen von CMFCPropertyGridProperty und CMFCRibbonEdit einen Handler schreiben.

    Das spart mir ja schonmal das ändern von CEdit, aber von den zwei und vom PropertyGridCtrl muss ich ja trotzdem ableiten.
    Sonst kriegt das Control ja nicht mit, dass der Container (GridProperty) geändert wurde. Oder ich hab mal wieder ein Brett vorm Kopf. ^^; Passiert manchmal 😉


Log in to reply