2012-04-15 3 views
0

Ich habe den folgenden Code, Benutzer neue Zeilen zu schreiben in einem Memo-Texteditor verhindern gemeint:System.Windows.Forms.Keys.HasFlag verhalten weirdly

private void m_commentMemoEdit_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyData.HasFlag(Keys.Enter)) 
    { 
     e.SuppressKeyPress = true; 
    } 
} 

Es ist wirklich nicht daran hindert, Enter eingefügt wird , aber seltsamerweise verhindert es, dass andere Schlüssel eingefügt werden. Bisher haben wir entdeckt, dass die Schlüssel "O", "M", "/" und "-" auch "gefangen" werden.

Update: Der folgende Code tut, was ich brauche:

private void m_commentMemoEdit_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyValue == (int)Keys.Return) 
    { 
    e.SuppressKeyPress = true; 
    } 
} 

Aber ich verstehe immer noch nicht der frühere Code nicht funktioniert und das tut.

Ich habe die System.Windows.Forms.Keys Enum angeschaut, aber habe keine Hinweise gefunden (obwohl ich sagen muss, dass dies eine seltsam konstruierte enum ist). Kann mir jemand erklären, warum das passiert?

Antwort

0

Ich vermute, es hat etwas damit zu tun, dass die zugrundeliegenden Werte der System.Windows.Forms.Keys Enumeration direkt auf die Tastaturcodes abgebildet werden, die sich nicht immer gegenseitig ausschließen. Die Dokumentation besagt, dass Sie keine bitweise Operation für sie verwenden sollten, und gibt ein Beispiel dafür, warum nicht (Beware the FlagsAttribute on the enum!).

MSDN sagt auch, dass die HasFlag Funktion das Ergebnis dieser zurückgibt: thisInstance And flag = flag, so dass Sie könnte möglicherweise ein Haltepunkt gesetzt und Blick auf den tatsächlichen binären Codes in den kommenden und sehen, ob diese Operation Sie für den Satz von Tasten einen wahren würde du hast aufgelistet.

Am Ende ist Ihr aktualisierter Code der richtige Weg, um das zu tun, was Sie tun möchten.

0

hasFlag ist für Flags - das heißt, wenn ein Bit gesetzt ist oder nicht

die keyvalue ist ein Ordnungswert, so völlig verschieden von Fahnen den Vergleichsoperator und alles verwenden sollte in Ordnung sein.

einige Enum-Felder sind wie Flags definiert, z.B.

enum SomeFlag 
{ 
    BitOne = 1, 
    BitTwo = 2, 
    Bitthree = 4 
}; 

hier macht es Sinn "hasFlag"

3

HasFlags() zu verwenden, wird von Enum.HasFlags geerbt(). Dies ist nützlich für Aufzählungen, die mit dem Attribut [Flags] deklariert sind. Es verwendet den Operator &, um einen Test auf Bitwerte durchzuführen. Problem ist, Keys.Enter ist kein Flag-Wert. Sein Wert ist 0x0d, 3 Bits sind gesetzt. Also jeder Schlüssel, der einen Wert mit den Bits 0, 2 oder 3 eingeschaltet hat, wird wahr zurückgeben. Wie Keys.O hat es den Wert 0x4f. 0x4f & 0x0d = 0x0d so HasFlags() gibt True zurück.

Sie sollten es nur mit Schlüsselwerten verwenden, die tatsächlich Merkerwerte darstellen. Sie sind Keys.Alt, Keys.Control und Keys.Shift. Beachten Sie, dass dies Modifizierer Schlüssel sind. So können Sie HasFlags verwenden, um den Unterschied zwischen zB F und Strg + F zu sehen.

Um Keys.Enter zu erkennen, sollten Sie einen einfachen Vergleich durchführen. Wie du herausgefunden hast. Beachten Sie, dass Ihre if() -Anweisung auch für Alt + Enter usw. gilt. Dies ist möglicherweise nicht das, was Sie möchten.Verwenden Sie stattdessen

if (e.KeyData == Keys.Return) e.SuppressKeyPress = true; 

Das unterdrückt die Eingabetaste nur, wenn keine der Zusatztasten gedrückt wird.