Производный класс Windows.Forms.Control с TabStop и ключевыми событиями

У меня есть элемент управления, производный от Forms.Control, он отлично обрабатывает события мыши и события рисования, но у меня проблема с ключевыми событиями. Мне нужно обрабатывать стрелку влево и стрелку вправо, но пока элемент управления Tab, содержащий мой класс, ест их.

Как сделать этот элемент управления выбираемым, фокусируемым?


person David Rutten    schedule 03.05.2010    source источник


Ответы (3)


Вот хороший учебник по созданию фокусируемого элемента управления. Я просто следил за ним, чтобы убедиться, что он работает. Кроме того, в элемент управления добавлено событие нажатия клавиши, которое работает при условии, что элемент управления имеет фокус.

http://en.csharp-online.net/Architecture_and_Design_of_Windows_Forms_Custom_Controls%E2%80%94Creating_a_Focusable_Control

По сути, все, что я сделал, это создал экземпляр своего пользовательского элемента управления, который наследуется от элемента управления. Затем добавлено событие KeyPress, Click и Paint. Нажатие клавиши было просто сообщением:

void CustomControl1_KeyPress(object sender, KeyPressEventArgs e)
{
        MessageBox.Show(string.Format("You pressed {0}", e.KeyChar));
}

Событие Click имеет только:

this.Focus();
this.Invalidate();

Событие рисования я сделал так, просто чтобы оно было видно:

protected override void OnPaint(PaintEventArgs pe)
{
        if (ContainsFocus)
            pe.Graphics.FillRectangle(Brushes.Azure, this.ClientRectangle);
        else
            pe.Graphics.FillRectangle(Brushes.Red, this.ClientRectangle);
}

Затем, в основной форме, после создания экземпляра с именем mycustomcontrol и добавления обработчиков событий:

mycustomcontrol.Location = new Point(0, 0);
mycustomcontrol.Size = new Size(200, 200);
this.Controls.Add(mycustomcontrol);

Пример намного аккуратнее, чем мой пятиминутный код, просто хотел убедиться, что таким образом можно решить вашу проблему.

Надеюсь, это было полезно.

person Brandi    schedule 03.05.2010

Чтобы ваш элемент управления можно было выбрать, он должен иметь ControlStyles.Selectable набор стилей. Вы можете сделать это в конструкторе, вызвав SetStyle .

person Jeff Yates    schedule 03.05.2010
comment
Да, но это явно не все. Мне нужно обрабатывать конкретное событие или что-то в этом роде? - person David Rutten; 03.05.2010

Не видя вашего кода, я могу только сказать вам, что я создал контейнер с 3 вкладками и создал очень простой элемент управления, который отменял OnGotFocus:

public partial class CustomControl1 : Control
{
    public CustomControl1()
    {
        InitializeComponent();
    }

    protected override void OnGotFocus(EventArgs e)
    {
        this.BackColor = Color.Black;
        base.OnGotFocus(e);
    }
    protected override void OnPaint(PaintEventArgs pe)
    {
        base.OnPaint(pe);
    }
}

Я поместил элемент управления на форму вместе с парой других кнопок, правильно установил позиции табуляции, и поведение было ожидаемым. Некоторые другие свойства по умолчанию были изменены в коде, из-за чего элемент управления нельзя было выбрать.

person TheHurt    schedule 03.05.2010