VK_LEFT + VK_RIGHT im Dialog



  • Hast du auch ON_WM_KEYDOWN() in die Message Map aufgenommen?



  • Jo, das hat der Assi schon gemacht... 🙂

    Theo



  • Irgendwie war ich PreTranslateMessage schon ein bischen weiter. heul 😉
    Also falls noch jemand eine Idee hat wie ich zu meinen Pfeiltasten komme...

    Thx! 🙂



  • So, habe noch ein bisschen rumprobiert und herausgefunden das die WM_KEYDOWN Nachrichten nur dann funzen, wenn ich alle Buttons aus meinem Dialog entferne. Sobald ich Buttons einbaue, kriege ich keine Tastatur-Nachricht mehr. Ist Euch sowas auch schonmal passiert? Wie kann sowas denn in einem ganz normalen modalen Dialog passieren?
    Wäre wirklich froh, wenn jemand zu der Sache noch nen Einfall hätte... 🙂



  • Du kriegst nur die Nachrichten die an dein Fenster gerichtet sind.

    Wenn z.B. ein Button den Focus (-> Keyboard-Focus) hat dann kriegt er alle Keyboard-Nachrichten.

    Was du suchst sind Accelerators.

    Erstellen kannst du die entweder mit CreateAcceleratorTable oder du lädst sie aus deinen Resourcen mit LoadAccelerators.
    Alles weitere in der MSDN.

    /E: Du kannst nat. die auch in PreTranslateMessage abfragen.

    if(pMsg->message == WM_CHAR)
    // ...

    [ Dieser Beitrag wurde am 13.01.2003 um 00:16 Uhr von Nemesyzz editiert. ]



  • Mit PreTranslateMessage laufe ich nur wieder in das anfängliche Prob rein (siehe oben) 😉 . Werde es mal mit den Accelerators probieren.

    Thx 🙂



  • hmmm, aber das mit den Accelerators nutzt man eigentlich nur bei Tastenkombinationen wie beispielsweise STRG + J, oder ALT + O und sowas. Bei sowas wie Links und Rechts sollte man tastsächlich eher die Lösung mit PreTranslateMessage nehmen. Poste mal deinen Code dazu, wo es nicht geklappt hat. Es müßte nämlich eigentlich funktionieren. Ich denke mal, du hast da nur einen kleinen Fehler gemacht.



  • Hi! Das Problem ist meiner Ansicht nach ein logisches: Das Programm löst eine neue WM_PAINT Nachricht aus bevor PreTranslateMessage verlassen wurde. Darum "hustet" das Fenster glaube ich. Oder liege ich da falsch? Der Compiler meckert jedenfalls nicht rum...

    #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) //thx to C-O-M-M-A-N-D-E-R
    
    BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) 
    {
       // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen
       if (KEY_DOWN(VK_LEFT))
        {
          OnLinks();
        }
       if (KEY_DOWN(VK_RIGHT))
        {
          OnRechts();
        }
    
        return CDialog::PreTranslateMessage(pMsg);
    }
    
    void CMyDlg::OnRechts() 
    {
        // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
        Image->RotateRight();
        InvalidateRect(thisRec,TRUE);
        return;
    }
    
    void CMyDlg::OnLinks() 
    {
        // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
        Image->RotateLeft();
        InvalidateRect(thisRec,TRUE);
        return; 
    }
    

    Gruss



  • hmm, die WM_PAINT Message wird einfach nur in die Message-Queue gelegt und später behandelt. Aber PreTranslateMessage müßte durchlaufen. Ist vielleicht thisRec falsch? Probier stattdessen mal NULL.

    ABER:
    So lange das Ding nur Flackert ist es ja ne ganz normale Sache. InvalidateRect lässt das ganze eben neuzeichnen und das sieht man halt. 🙂



  • Da du den ganzen Dialog neuzeichnest, könnte das mit dem Button auch ganz normal sein. Oder spinnt der auch wenn du die Tasten VK_LEFT und VK_RIGHT nicht drückst? Das ist bestimmt interessant für dich:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dngdi/html/msdn_flicker.asp



  • Es gibt nen Zusammenhang mit PreTranslateMessage: Wenn ich mein OnLinks mit der Maus bediene flackert gar nix. Mit Tastatur flackert's und der OK Button verschwindet.


Anmelden zum Antworten