【问题标题】:C#: Windows Forms: Getting keystrokes in a panel/picturebox?C#:Windows 窗体:在面板/图片框中获取击键?
【发布时间】:2011-02-11 18:28:42
【问题描述】:

我正在使用 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 甚至可以接收键盘输入吗?我希望允许用户在处理文本输入时使用复制/粘贴/全选命令,但在游戏世界中放置对象时不允许。

【问题讨论】:

    标签: c# .net user-interface winforms


    【解决方案1】:

    来自 Control.CanSelect 的 MSDN 文档:

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

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

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

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

    然后使用这个控件代替普通的面板。您可以按预期处理 PreviewKeyDown 事件。

    【讨论】:

      【解决方案2】:

      您可能希望在表单级别进行密钥捕获。强烈建议帮助编写底层 .NET 代码的人阅读这篇文章:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-27
        • 1970-01-01
        • 1970-01-01
        • 2011-11-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多