Пользовательская библиотека управления Windows в C # - PullRequest
0 голосов
/ 18 мая 2011

Я создал настраиваемое текстовое поле с помощью библиотеки управления Windows Forms, в котором есть опции для Numeric Text Box, Alpa Numeric Text Box, Decimal и т. Д. *

Я переопределил PreProcessMessage(ref Message msg) Способ сделать это.

Вот мой пример фрагмента для Numeric Text Box

    public override bool PreProcessMessage(ref Message msg)
    {
        int WM_KEYDOWN = 0x0100;
        if (msg.Msg == WM_KEYDOWN)
        {
            Keys keys = (Keys)msg.WParam.ToInt32();
            bool bNumbers = false;
            switch (eType)
            {

                case enTextBoxTypes.Numeric:

                    bNumbers = ((keys >= Keys.D0 && keys <= Keys.D9) || (keys >= Keys.NumPad0 && keys <= Keys.NumPad9)) && ModifierKeys != Keys.Shift;
                    System.Diagnostics.Debug.Print(bNumbers.ToString());
                    if ((keys == Keys.OemMinus || keys == Keys.Subtract) && bAllowMinusSign && ModifierKeys != Keys.Shift)
                    {
                        bIsOEMMinus = (keys == Keys.OemMinus) | (keys == Keys.Subtract);
                        if ((this.Text.Length != this.SelectedText.Length || !bAllowMinusSign) && this.SelectionStart != 0)
                            bIsOEMMinus = false;
                    }

                    break;
            } 
            bool bDel = keys == Keys.Delete;
            bool bBack = keys == Keys.Back;
            bool arrows = (keys == Keys.Up) | (keys == Keys.Down) | (keys == Keys.Left) | (keys == Keys.Right);
            bool Enter = (keys == Keys.Enter);
            bool ESC = (keys == Keys.Escape);
            bool TAB = (keys == Keys.Tab);
            bool Home = (keys == Keys.Home);
            bool End = (keys == Keys.End);

            if (bNumbers  bBack | bDel | arrows | Home | End | bIsOEMMinus)
                return false;
            else if(TAB)
                return base.PreProcessMessage(ref msg);
            else
                return true;                
        }
        else
            return base.PreProcessMessage(ref msg);
    }

Теперь мне нужно реализовать unit в текстовом поле, для этого я добавил новыйперечисление в TextBox type т.е. Distance.Поэтому, если я ввел десятичное число, а после этого, если я нажал клавишу k, к значению текстового поля следует добавить Km

, например, если текстовое поле имеет текст 100, а затемЯ нажал k, тогда текст текстового поля должен быть 100Km.

. Кроме того, мне нужно предоставить функциональность смены модуля клавишам Up Down.

Так что если я нажимаюdown введите текстовое поле с указанным выше значением, тогда значение текстового поля должно быть 100000m.

Как мне это сделать?

Ответы [ 2 ]

1 голос
/ 18 мая 2011

Возможно, вы могли бы просто унаследовать элемент управления textbox и изменить события OnTextChanged и onkeydown. Посмотрите на эту ссылку, он использует оба события. (Не смотрите на имя, хотя)

Если вы не думаете, что это поможет вам по какой-либо причине, пожалуйста, объясните мне, что вас удерживает.

1 голос
/ 18 мая 2011

Возможно, вы можете использовать текстовое поле в маске, если это ваш вопрос. Потому что я вижу, что у вас уже есть KeyDown, и я думаю, что вы знаете, как справиться. Пошаговое руководство. Работа с элементом управления MaskedTextBox

Me.MaskedTextBox1.Mask = "00/00/0000"
MaskedTextBox1.ValidatingType = GetType(System.DateTime)

Образец редактирования маски

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...