Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Που πήγε το keydown event?

Îåêßíçóå áðü ôï ìÝëïò mclisme. Τελευταία δημοσίευση από το μέλος panagiotis_georgiadis στις 02-06-2009, 13:52. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  27-05-2009, 00:41 51004

    Που πήγε το keydown event?

    Σε μια απλή winform που περιέχει μόνο ένα picturebox, ένα timer και ένα colordialog ήθελα να μπορώ να σχεδιάζω στο picturebox κάποια σχέδια ανάλογα του αν ο χρήστης πατάει κάποιο απο τα τέσσερα βελάκια του πληκτρολογίου. Επειδή τα αντικείμενα picturebox δεν έχουν κανένα event τύπου Keypress ή Keydown/Up κατάφερα να το κάνω γράφοντας τον κώδικα στο Form1_KeyDown event και δούλευε μιά χαρά. Απο την στιγμή όμως που προσέθεσα ένα button, για κάποιο λόγο δεν συμβαίνει τίποτα όποιο πλήκτρο και αν πατήσω. Προσέθεσα το event Button1.KeyDown στον handler του Form1.KeyDown αλλά τίποτα. Όσο έχω Enabled το Button1 το πάτημα πλήκτρων δεν έχει κανένα αποτέλεσμα. Μόλις έκανα Disabled το Button1 τότε επανήλθε η προηγούμενη συμπεριφορά. Το περίεργο είναι ότι δοκίμασα να βρώ τι συμβαίνει με Step Into ώστε να με πάει στο event που λαμβανει τοπο μολις πατάω κάποιο κουμπί αλλά ακόμα και τότε δεν συνέβη τίποτα, πατάω πλήκτρα όμως o debugger δεν σταματά πουθενά.
    Που οφείλεται αυτή η συμπεριφορά και πως μπορώ να συνεχίσω να κάνω ότι έκανα αλλά να έχω και κάποια button μέσα στη φόρμα μου?
  •  27-05-2009, 00:56 51005 σε απάντηση της 51004

    Απ: Που πήγε το keydown event?

    Άλλαξε το KeyPreview property της φόρμας σε True και θα δουλέψει. Ουσιαστικά έτσι μόνο η φόρμα θα κάνει Process τα KeyEvents κι όχι το control το οποίο θα έχει focus εκείνη την στιγμή.
    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  27-05-2009, 01:03 51006 σε απάντηση της 51005

    Απ: Που πήγε το keydown event?

    Το έκανα μόλις, όμως δεν άλλαξε κάτι, ακόμα το πάτημα οποιοδήποτε πλήκτρου είναι σαν μην συμβαίνει.
  •  27-05-2009, 02:05 51008 σε απάντηση της 51006

    Απ: Που πήγε το keydown event?

    Προφανώς δεν άλλαξε γιατί το Button είναι Control που έχει CanSelect=true και μπορεί να κλέψει το Focus από το parent control. Δες το παράδειγμα στο MSDN:

    http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview.aspx#Mtps_DropDownFilterText

    όντως το KeyPreview πρέπει να είναι true, αλλά δεν αρκεί μόνο αυτό.

    Σαν γρήγορη λύση ίσως να βοηθούσε να βάλεις έναν αντιστοιχο event handler και για το Button.KeyDown, ο οποίος να στέλνει το event στον handler της φόρμας. Δεν το προτείνω όμως :-)
    Προτιμώ το παράδειγμα της Microsoft.

     


    Panagiotis Georgiadis
    HBM Netherlands B.V.
    www.twitter.com/HimWithCurls
    Δημοσίευση στην κατηγορία:
  •  27-05-2009, 12:33 51015 σε απάντηση της 51008

    Απ: Που πήγε το keydown event?

    Αν κατάλαβα καλά από το παράδειγμα πρέπει να προσθέσω την εντολή e.Handled = True στο keypress event μιας φορμας ωστε τα παντα να περνανε πρωτα απο αυτή. Όμως:

    1) Το keypress δεν μπορει να αναγνωρίσει τα arrow keys. ***
    2) Ακόμα κ όταν το προσέθεσα όμως, πατώντας οποιοδήποτε κουμπί (όχι μόνο τα βελάκια) πάλι δεν δουλεύει.

    *** όχι το ίδιο το keypress αλλά το argument  e.KeyChar που είναι το μόνο που έχει για να αναγνωρίσει ποιό πλήκτρο πατήθηκε. Τα KeyDown, KeyUp κτλ. έχουν επιπλέον το argument e.KeyCode που μπορει να αναγνωρίσει όλα τα πλήκτρα.
  •  02-06-2009, 13:52 51229 σε απάντηση της 51015

    Απ: Που πήγε το keydown event?

    Όχι, δεν κατάλαβες καλά.

    Το Event KeyPress(object sender, KeyEventArgs) διαβάζει KeyData που είναι αυστηρά χαρακτήρες, ποτέ δε θα καταλάβει ότι πάτησες βελάκι. Για αυτό το σκοπό έχεις 2 λύσεις:

    1) Θα θέσεις το CausesValidation όλων των Controls στη φόρμα σου τα οποία έχουν αυτό το property (τα οποία κλέβουν το focus με το βελάκι) σε false, και θα χρησιμοποιήσεις το KeyDown του αντίστοιχου control, το οποίο θα σου κάνει forward σε μια άλλη private συνάρτηση - δε θα πιάσεις όμως ποτέ το γεγονός ότι ο χρήστης πάτησε βελάκι.

    2) Πιο γενική λύση είναι να κατέβεις ένα επίπεδο χαμηλότερα και να κάνεις handle το Win32 keystroke event γράφωντας την εξής συνάρτηση στην φόρμα σου:

              protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
              {
                   return base.ProcessCmdKey(ref msg, keyData);
              }
    Έτσι μπορείς να πιάσεις το βελάκι. Ίσως όμως καλύτερα να σκεφτείς πρώτα γιατί είναι τόσο απαραίτητο στο χρήστη σου να καταφύγει σε τέτοιο τρόπο εισαγωγής δεδομένων,

    μια και τα Windows Applications είναι πλούσια σε γραφικές User Interface επιλογές, για να μη χρειάζονται τα παλιομοδίτικα DOS keystrokes.
    Ένα tip: αν γράψεις "override" και spacebar στο Visual Studio σου ανοίγει παράθυρο AutoComplete με τη συλλογή από όλες τις overload που μπορείς να κάνεις
    Για πειραματισμό (ή αλλιώς "το καλό το παλικάρι ξέρει κι άλλο μονοπάτι"), μπορείς να βάλεις ΟΛΑ τα event handlers που ειπώθηκαν παραπάνω στον κώδικά σου και να βάλεις ένα breakpoint στο καθένα. Όταν κάνεις debug θα δεις με ποια απ'όλα και με ποιά σειρά καλούνται.
     

    Panagiotis Georgiadis
    HBM Netherlands B.V.
    www.twitter.com/HimWithCurls
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems