Edit-Feld mit WM_CHAR versehen



  • Hallo zusammen,
    vorweg: Ich bin absolut kein C++ Spezialist.
    Hier meine Frage:
    Ich benötige für verschiedene Edit-Felder das OnChar-Ereignis um zu Prüfen ob der Benutzer die Berechtigung hat dort was zu ändern.
    Ich hab versucht mir eine neue Klasse

    Class CMyEdit : public CEdit
    

    erstellt und dort WM_CHAR als Ereignis eingefügt. Aber irgendwie komme ich da jetzt nicht mehr weiter.
    Wie schaffe ich es jetzt, auf meinem Dialog die Edit-Felder mit der Nachricht "OnChar" zu versehen?

    Gruß
    Ronnie



  • Probier mal über "ProcessWindowMessage()" auf WM_CHAR zu reagieren...



  • Hallo,
    erstmal danke für die schnelle Antwort.
    Irgendwie find ich da nix über ProcessWindowMessage().??



  • Jedes CWnd-Objekt kennt die ProcessWindowsMessage(). Es ist genauso einzufügen wie z.B. WM_CHAR (im selben Auswahldialog). Diese Funktion ist vergleichbar mit der API-Message-Funktion "WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)". Hier kann man dann auf message == WM_CHAR reagieren.


  • Mod

    Und warum das?
    Warum setzt Du den Stil für die Contrls nicht aus ES_READONLY (SetReadOnly). WM_CHAR ist nicht der einzige Weg ein Edit-Control zu beeinflussen und zu verändern...



  • Wieso die holzhammermethode (ProcessWindowsMessage), wenn du schon ne abgeleitete Klasse hast, kannst du doch in der OnChar überladen und entweder in deiner Anwenung allen CEdit´s ne Membervariable geben und den Klassennamen der Edits in CMyEdit ändern oder du machst einfaches Subclassing der entsprechenden Edit-Fleder, wie das geht kannst du mit Hilfe einer SWuchmaschine raus finden.

    aber wenn der User sich eh irgendwie autendifiziert bei deiner Anwendung, warum Sperrst du nich einfach die Edits die nicht Verändert werden dürfen, sieht dann auch für den user logischer aus, weil bei deiner Version mit nicht ändern dürfen, sieht das dann sicher wie ein bug aus, aber net wie absicht, nur mal so als gedanke zu deinem vorhaben.



  • Hallo,
    danke euch allen für die Antworten.
    Ich versuche es jetzt mit dem Subclassing aber ich krieg immer einen Compiler-Fehler.

    error C2440: 'type cast' : 'long (__stdcall CCppADOTestDlg::*)(struct HWND__ *,unsigned int,unsigned int,long)' kann nicht in 'long' konvertiert werden
            Diese Konvertierung ist eine gueltige Standardkonvertierung, die implizit oder mit dem static_cast-Operator oder mit einer Typumwandlung im C- oder Funktionsformat durchgefuehrt wird
    

    Hier noch etwas Code dazu:

    WNDPROC wpOrigEditProc; //Als public deklariert in der Klasse
    
    // Hier im InitDialog entsteht der Fehler.
    wpOrigEditProc = (WNDPROC)SetWindowLong(m_Edit1.m_hWnd,GWL_WNDPROC, (long)SubclassProc);
    
    // Subclass Procedure
    LRESULT APIENTRY CCppADOTestDlg::SubclassProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) {
        if (uMsg == WM_CHAR) 
    		{
          return 0;
        }
    
        return CallWindowProc(wpOrigEditProc, hwnd, uMsg,
            wParam, lParam);
    }
    

    Hat da auch jemand eine Idee dazu?

    Gruß
    Ronnie



  • Wieso so umständlich? Ich geh mal davn aus das m_Edit1 die Membervariable deines Editfeldes ist, welches in der Headerdatei als

    CEdit m_Edit1;
    

    steht. Dann ändere doch einfach das CEdit in der Headerdatei auf CMyEdit include noch MyEdit.h damit die Klasse bekannt ist und fertig ist die Sache. Ohne großen umstand, so mach ich das immer.



  • Hallo,
    so hab ichs jetzt auch gemacht.
    Trotzdem würde ich, rein aus Interesse, gerne wissen wie ich diesen Compilerfehler wegbekomme?

    Ronnie


  • Mod

    1. Du hast eine Klassen Funktion verwendet. Für den Subclass kannst Du aber nur eine statische Funktion verwenden. Dazu gibt es hier in diesem Forum auch schon genug Beiträge.
    2. Nochmal: Du musst gar keinen subclass verwenden. ES_READONLY ist weitaus sicherer und behandelt eben alle Fällt, doe zu einer Manipulation führen können...


Log in to reply