Seltsames Verhalten eines Edit Controls



  • Hallo,

    habe ein äußerst seltsames Problem mit meinem Edit Control. Jedes mal wenn man ein Zeichen eingibt, wird das Zeichen zwei mal rein geschrieben! (Betrifft nur Edit Controls des eigenen Programmes). Habe eigentlich nichts großartiges geändert und die callback Routine ist bis auf ein WM_PAINT nun leer. Hängt es irgendwie mit UNICODE zusammen? Oder mit dem Dialog in dem es angezeigt wird? Also wenn jemand eine Idee hat, gerne melden.



  • ka du machst was falsch, zeig den code



  • Okay habe das Problem jetzt gefunden, allerdings noch keine richtige Lösung gefunden. Folgender Code führt zu mehr oder weniger undefiniertem Verhalten:

    while (GetMessage (&msg, NULL, 0, 0))
    {
        size_t size = vec_Dialog.size();
    
        for (size_t si = 0; si < size; si++)
        {
            if (!IsDialogMessage (vec_Dialog.at(si).hWnd, &msg))
                if (si == size -1)
                {
                    TranslateMessage (&msg);
                    DispatchMessage (&msg);
                }
            }
        }
    }
    

    Jetzt denkt ihr euch bestimmt, was macht der denn für ein Scheiß? Es sieht folgendermaßen aus. Ich erstelle in einem Thread mehrere Dialoge über CreateDialogParam und speichere die HWNDs davon in einem vector ab. Dann werden die Messages abgearbeitet. Nun möchte ich, dass man mit Tab (WS_TABSTOP natürlich definiert) durch die (alle) Dialoge tabben kann. Daher reicht nicht mehr ein einfaches TranslanteMessage sondern ich muss IsDialogMessage verwenden. Doch dieses will ein HWND eines Dialoges auf das es prüfen soll. Deswegen das mit der Schleife. Dadurch werden wohl allerdings, manche Messages mehrfach bearbeitet und ich habe mehrere Zeichen auf ein mal in z.B. meinem Edit Control.
    Hat da jemand vielleicht eine Idee wie ich dies alles korrekt implementieren kann?



  • Ich glaub ich würd's so machen:

    // Die Abfrage in "while" ist übrigens mehr oder weniger gefährlich, weil GetMessage
    //   bei einem Fehler auch -1 zurückgeben kann, was dann aber auch als "true" ausge-
    //   wertet wird
    while ( GetMessage (&msg, NULL, 0, 0) )
    {
        bool processed = false; // Gibt an, ob die Nachricht schon verarbeitet wurde
        size_t size = vec_Dialog.size();
    
        for (size_t si = 0; si < size; si++)
            if ( vec_Dialog.at(si).hWnd==msg.hwnd && IsDialogMessage(vec_Dialog.at(si).hWnd, &msg))
            {
                processed = true;
                break; // Springt aus der for-Schleife raus
            }
    
        if ( ! processed )
        {
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
    }
    

    Kann aber auch falsch sein, ist ja schon spät 😉



  • Leider geht es so auch nicht, man kann nicht rumtabben.
    Es kann doch nicht sein, dass man das nicht machen kann!?
    Im Prinzip benötige ich IsDialogMessage ja nur um tabben zu können, kann man das auch von Hand implementieren?


  • Mod

    Aber wenn die Nachricht per IsDialogMessage bearbeitet worden ist, darfst Du sie nicht weitersenden.

    In meinen Augen müsste es schon so gehen wie Badestrand geschrieben hat.
    Aber man muss jede Nachricht per IsDialogMessage anbieten auch wenn diese für andere Fenster sind.

    while ( GetMessage (&msg, NULL, 0, 0) )
    {
        bool processed = false;
        size_t size = vec_Dialog.size();
    
        for (size_t si = 0; si < size; si++)
            if ( IsDialogMessage(vec_Dialog.at(si).hWnd, &msg))
            {
                processed = true;
                break; // Springt aus der for-Schleife raus
            }
    
        if ( ! processed )
        {
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
    }
    


  • Oha so funktioniert es jetzt anscheinend!
    Super, danke an euch beide!


Anmelden zum Antworten