C#:Windows窗体:在面板/图片框中获取击键?

我正在使用Windows窗体为游戏制作关卡编辑器。 该表单有几个下拉菜单,文本框等,用户可以在其中键入信息。

我想让CTRL + VCTRL + A等命令可用于游戏世界本身,而不是文本操作。 游戏世界由Panel包含的PictureBox表示。

此事件处理程序不会触发:

 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命令,但在将对象放入游戏世界时则不允许。

从Control.CanSelect的MSDN文档:

以下列表中的Windows窗体控件不可选,并且将为CanSelect属性返回false值。 从这些控件派生的控件也是不可选择的。

  • 面板
  • 分组框中
  • 图片框
  • 进度条
  • 分离器
  • 标签
  • LinkLabel(当控件中没有链接时)

虽然它表示从这些控件派生的控件无法获得焦点,但您可以创建派生控件并使用SetStyle方法启用“可选”样式。 您还必须将TabStop属性设置为true才能使其正常工作。

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

然后使用此控件而不是普通的Panel。 您可以按预期处理PreviewKeyDown事件。

您可能希望在表单级别执行密钥捕获。 强烈建议从帮助编写基础.NET代码的人那里阅读:

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