C #: Windows Forms: получать нажатия клавиш на панели / в картинке? - PullRequest
3 голосов
/ 24 апреля 2010

Я делаю редактор уровней для игры, используя формы Windows. Форма имеет несколько раскрывающихся меню, текстовых полей и т. Д., Где пользователь может вводить информацию.

Я хочу сделать такие команды, как CTRL + V или CTRL + A доступными для работы в самом игровом мире, а не для манипулирования текстом. Игровой мир представлен PictureBox, содержащимся в Panel.

Этот обработчик событий никогда не запускается:

private System.Windows.Forms.Panel canvas;
// ...
this.canvas = new System.Windows.Forms.Panel();
// ...
this.canvas.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.canvas_PreviewKeyDown);

Каков предпочтительный способ сделать это? Может ли panel даже получать ввод с клавиатуры? Я хотел бы позволить пользователю использовать команды copy / paste / select-all при работе с вводом текста, но не при размещении объектов в игровом мире.

Ответы [ 2 ]

1 голос
/ 24 апреля 2010

Возможно, вы захотите сделать захват ключа на уровне формы. Это настоятельно рекомендуется прочитать от человека, который помог написать основной код .NET:

http://blogs.msdn.com/jfoscoding/archive/2005/01/24/359334.aspx

1 голос
/ 24 апреля 2010

Из документации MSDN для Control.CanSelect:

Элементы управления Windows Forms в следующий список недоступен для выбора и вернет значение false для CanSelect свойство. Полученные элементы управления от этих элементов управления также нет выбор.

  • Панель
  • GroupBox
  • PictureBox
  • ProgressBar
  • Разветвитель
  • Метка
  • LinkLabel (когда в элементе управления нет ссылки)

Хотя в нем говорится, что элементы управления, полученные из этих элементов управления, не могут получить фокус, вы можете создать производный элемент управления и использовать метод SetStyle, чтобы включить стиль «Выбираемый». Чтобы это работало, вы также должны установить для свойства TabStop значение true.

public class SelectablePanel : Panel
{
    public SelectablePanel()
    {
        this.SetStyle(ControlStyles.Selectable, true);
        this.TabStop = true;
    }
}

Затем используйте этот элемент управления вместо обычной панели. Вы можете обработать событие PreviewKeyDown как задумано.

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