VK_LEFT + VK_RIGHT im Dialog



  • Hm, wie meinst Du denn das mit WM_KEYDOWN? Bin noch neu und kannte bisher nur diesen Weg Nachrichten abzufangen.
    Thx 🙂



  • Also der Weg über PreTranslateMessage, ist für sowas eher ungeeignet, sollte aber trotzdem funktionieren. Schau doch mal in einem MFC Buch oder Tutorial nach. (Nachrichtenverarbeitung, Message Map usw.). Das alles hier zu erklären hätte wohl nicht viel Sinn. 🙂



  • OK, das habe ich jetzt kapiert und lasse mir vom Klassen-Assi eine Funktion auf WM_KEYDOWN erstellen. Ist tatsächlich nicht so schwer...
    Nun habe ich aber das Problem, dass offenbar keine Nachricht gesendet wird wenn ich eine Taste drücke:

    void CMyDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
        // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen
        MessageBox("Eine Taste wurde gedrückt!");   
    
        CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
        return;
    
    }
    

    Wenn ich das richtig verstehe, sollte jetzt eigentlich auf jede Taste meine MessageBox hochpoppen oder? Tut sie aber nicht 😞
    Habt Ihr ne Ahnung wieso nicht?



  • 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