wie schaffe die Pfeiltastenunterstützung?



  • Hallo MFC Experte,

    ich möchte in meine Tabelle die Pfeiltasten funktionieren lassen.
    Mit der Ereignes KeyDown habe ich das ausprobiert.

    die Code:

    void CEditItem::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
        // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen
        BOOL Control = GetKeyState(VK_CONTROL)<0;
       BOOL Shift = GetKeyState(VK_SHIFT)<0;
      switch(nChar)
      {
      case VK_UP:
        {
          if(m_nItem>0)
         pListCtrl->EditItem(m_nItem-1,m_nSubItem);
          return;
        }
      case VK_DOWN:
        {
         pListCtrl->EditItem(m_nItem+1,m_nSubItem);
          return;
        }
    
       case VK_HOME:
        {
          if(!Control)
           break;
            pListCtrl->EditItem(0, m_nSubItem);
          return;
        }
      case VK_END:
        {
          if(!Control)
            break;
          int Count=pListCtrl->GetItemCount()-1;
          pListCtrl->EditItem(Count, m_nSubItem);
          return;
        }
      }
    
        CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
    
    }
    

    Für linke und rechte Pfeiltaste finde die richtige code irgendwie nicht.
    die Tasten sollen sowohl in einem Feld gedruckt werden können,als auch wenn
    man die Return Taste gedrukt hat. Wenn man gar nicht schreibt, soll man mit linke oder rechte Pfeiltaste in den nächsten Feld springen.

    wenn ich für die recht Taste die Code wie unten schreibe, dann kann ich mich nicht in dem Feld bewegen.Der Focus springt weiter, bevor ich Return-Taste gedruckt habe.

    case VK_RIGHT:
        {
    
          if(Shift)
          {
            if(m_nSubItem>0)
    
              pListCtrl->EditItem(m_nItem,m_nSubItem-1);
    
            else
            {
    
              if(m_nItem>0)
    
                pListCtrl->EditItem(m_nItem-1,pListCtrl->getColumncount()-1);
    
            }
          }
          else
          {
            if(m_nSubItem<pListCtrl->getColumncount()-1)
    
              pListCtrl->EditItem(m_nItem,m_nSubItem+1);
    
            else
    
              pListCtrl->EditItem(m_nItem+1,0);
    
          }
          return;
        }
    

    wenn einer mir hilft, werde ich mich sehr freuen.
    Danke im Voraus!



  • also funktionieren tuts dann schon mal...
    Was du noch brauchst, ist eine verzögerung, so das er nicht direkt weiterspringt...

    Versuch es mal mit dem Aufruf von _sleep(DWORD milliseconds);

    Devil



  • Versuch es mal mit dem Aufruf von _sleep(DWORD milliseconds);

    Wo rufe ich dann auf? Kannst du mal in der Code mir Zeigen?
    wenn ich so schreibe, habe ich Fehlermeldung.

    case VK_RIGHT:
        {
    
          if(Shift)
          {
            if(m_nSubItem>0)
    
              pListCtrl->EditItem(m_nItem,m_nSubItem-1);
    
            else
            {
    
              if(m_nItem>0)
    
                pListCtrl->EditItem(m_nItem-1,pListCtrl->getColumncount()-1);
    
            }
          }
          else
          {
             if(m_nSubItem<pListCtrl->getColumncount()-1)
    
               pListCtrl->EditItem(m_nItem,m_nSubItem+1);
    
            else
    
               pListCtrl->EditItem(m_nItem+1,0);
    
          }
          sleep(DWORD milliseconds);
    
          return;
        }
    


  • sag mal du kapierst auch garnix ? oder ?
    DWORD ist der typ, den du übergeben musst...
    natürlich solltest du dort einen wert übergeben, also eine Zahl.
    milliseconds ist der name der zahl die an die funktion übergeben wird.
    also 1000 wäre dann zum Beispiel eine Sekunde...

    Ich würde dir mal empfehlen die Grundlagen von C++ zu lernen, bevor du mit der MFC anfängst.

    Devil



  • Ja schon, manche Sachen der Grundlagen von C++ fehlen mir, aber deine Idee hat mein Problem nicht gelöst. Die Verzögerung ist nicht der Fall.
    Hast du andere Idee?


Anmelden zum Antworten