Eingaben eleganter abfragen bei einer custom control?



  • Moin Forum.

    Ich schreibe mir eine custom control, da C# leider nicht das bietet, was ich möchte. Das Ziel ist es, eine Art Textfeld zu schreiben, wie es als bsp. in Powerpoint existiert. Es ist zwar auf einem fixen Bereich, aber soll den Text automatisch anpassen und immer zentriert sein. Soweit so gut, die Basis habe ich: https://i.imgur.com/A0n82HW.png

    Was mir allerdings gerade den Nerv raubt, ist die Tastatureingabe. Muss ich solche Späße hier wirklich machen?

    private void CardInputControl_KeyUp(object sender, KeyEventArgs e)
            {
                int keyValue = (int)e.KeyCode;
    
                if ( e.KeyCode == Keys.Back )
                {
                    if (Text.Length > 0 )
                    {
                        Text = Text.Substring(0, Text.Length-1);
                        Invalidate();
                    }
                }   
                else if (e.KeyCode == Keys.Space)
                {
                    Text += " ";
                }
                else if (e.Shift == true)
                {
                    Text += ConvertSpecialKeys(e.KeyCode);
                    Invalidate();
                }
                else
                {
                    string c = ConvertSpecialKeys(e.KeyCode);
                    Text += c.ToLower();
                    Invalidate();
                }
            }
    
    private string ConvertSpecialKeys(Keys key)
            {
                switch (key)
                {
                    case Keys.OemQuestion:
                        return "?";
                    case Keys.OemQuotes:
                        return "\"";
                    case Keys.Oemplus:
                    case Keys.Add:
                        return "+";
                    case Keys.OemMinus:
                        return "-";
                    case Keys.Oemcomma:
                        return ",";                                   
                    case Keys.OemSemicolon:
                        return ";";
                    case Keys.Multiply:
                        return "*";
                    case Keys.Divide:
                        return "/";
                    case Keys.Decimal:
                    case Keys.OemPeriod:
                        return ".";
                    case Keys.NumPad0:
                    case Keys.D0:
                            return "0";
                    case Keys.NumPad1:
                    case Keys.D1:
                            return "1";
                    case Keys.NumPad2:
                    case Keys.D2:
                            return "2";
                    case Keys.D3:
                            return "3";
                    case Keys.D4:
                            return "4";
                    case Keys.NumPad5:
                    case Keys.D5:
                            return "5";
                    case Keys.NumPad6:
                    case Keys.D6:
                            return "6";
                    case Keys.NumPad7:
                    case Keys.D7:
                            return "7";
                    case Keys.NumPad8:
                    case Keys.D8:
                            return "8";
                    case Keys.NumPad9:
                    case Keys.D9:
                            return "9";
                    case Keys.Shift:
                    case Keys.Alt:
                    case Keys.LControlKey:
                    case Keys.RControlKey:
                    case Keys.ControlKey:
                    case Keys.Control:
                    case Keys.Enter:
                    case Keys.LWin:
                    case Keys.RWin:
                    case Keys.Escape:
                    case Keys.ShiftKey:
                    case Keys.Menu:
                    case Keys.Apps:
                    case Keys.Home:
                    case Keys.PageDown:
                    case Keys.PageUp:
                    case Keys.Insert:
                    case Keys.Delete:
                    case Keys.End:
                    case Keys.Print:
                    case Keys.PrintScreen:
                    case Keys.Pause:
                    case Keys.F1:
                    case Keys.F2:
                    case Keys.F3:
                    case Keys.F4:
                    case Keys.F5:
                    case Keys.F6:
                    case Keys.F7:
                    case Keys.F8:
                    case Keys.F9:
                    case Keys.F10:
                    case Keys.F11:
                    case Keys.F12:
                    case Keys.F13:                    
                        return "";
                    default:
                            return key.ToString();                    
                }
            }
    

    Gibt es eine elegante Möglichkeit, das von C# formatieren zu lassen, dass der eben mir die Taste meldet, ohne dass ich das alles abfragen muss? Sorry für die Anfängerfrage, aber ich mach mit .net nicht oft was :).



  • Für ein zentriertes Textfeld kannst du doch einfach TextBox.TextAlign auf HorizontalAlignment.Center setzen.

    Und wenn du das KeyPress-Ereignis nutzt, bekommst du gleich die Taste als char mitgeliefert.



  • Th69 schrieb:

    Für ein zentriertes Textfeld kannst du doch einfach TextBox.TextAlign auf HorizontalAlignment.Center setzen.

    Das weiß ich, aber weder die Textbox noch die RichTextBox lassen ein alignment nach oben und unten zu.

    Th69 schrieb:

    Und wenn du das KeyPress-Ereignis nutzt, bekommst du gleich die Taste als char mitgeliefert.

    Das ganze beachtet aber weder i18n und special keys werden als wörter ausgegeben. Darum geht es. Dann hast auf einmal sowas wie "shiftd2d9menumenuoemhome" dastehen.


Anmelden zum Antworten