Производный класс Windows.Forms.Control с TabStop и событиями клавиш - PullRequest
0 голосов
/ 03 мая 2010

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

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

Ответы [ 3 ]

2 голосов
/ 03 мая 2010

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

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

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

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

Событие клика просто имеет:

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);

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

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

1 голос
/ 03 мая 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);
    }
}

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

1 голос
/ 03 мая 2010

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

...