Panel控件默认没有这些事件,现在我需要捕获这些事件,怎么处理?

解决方案 »

  1.   

    继承 Panel 类,重写受保护的方法:OnKeyDown()、OnKeyPress()、OnKeyUp()。
      

  2.   

    用 override 关键字,可以重写这些方法,基本结构系统会自动插入。在方法中通过对参数 e(类型是 KeyEventArgs)的处理达到处理事件的问题:
    比如:处理按F1键protected override void OnKeyDown(KeyEventArgs e){
      if(e.KeyCode=Keys.F1){
      // Do something Here.
      MessageBox.Show(null,"用户按下了 F1 按钮","KeyDown 事件发生");
      }
      base.OnKeyDown(e);
    }
      

  3.   

    不好意思,刚才看 VB.NET 来着,漏打一个 “=”
    ...
    if(e.KeyCode==Keys.F1)
    ...
      

  4.   

    谢谢zCheng(null refrence exception),不过不行哦……我现在就是想从Panel继承,写一个新的MyPanel组件,具有KeyPress/KeyUp/KeyDown这些事件。
      

  5.   

    下面列表中的 Windows 窗体控件是不可选择的。从这些控件派生的控件也是不可选择的。 Panel 
    GroupBox 
    PictureBox 
    ProgressBar 
    Splitter 
    Label 
    LinkLabel(当控件中没有链接时) -------------------------------------------------------------------------------不能由以上控件捕获键盘事件。主窗体 Form 就可以捕获键盘事件,楼主为什么要用 Panel 来捕获键盘事件呢?
      

  6.   

    我想做一个设计窗体,当按下Up/Down等键时,就改变Panel的位置或者大小。
      

  7.   

    那让 Form 捕获键盘事件来改变 Panel 的大小就可以了,Panel 是无法捕获键盘事件的。
      

  8.   

    using System;
    using System.Windows.Forms;class Test : Form
    {
      Panel pnl;
      int   step = 5;  Test()
      {
        Text            = "方向键移位,Shift+方向键改变大小";
        KeyPreview      = true;
        pnl             = new Panel();
        pnl.Parent      = this;
        pnl.BorderStyle = BorderStyle.FixedSingle;
      }  protected override void OnKeyDown(KeyEventArgs e)
      {
        Keys keysMod = Control.ModifierKeys;
        switch (e.KeyCode)
        {
          case Keys.Up   : if (keysMod == Keys.Shift) pnl.Height -= step; else pnl.Top  -= step; break;
          case Keys.Down : if (keysMod == Keys.Shift) pnl.Height += step; else pnl.Top  += step; break;
          case Keys.Left : if (keysMod == Keys.Shift) pnl.Width  -= step; else pnl.Left -= step; break;
          case Keys.Right: if (keysMod == Keys.Shift) pnl.Width  += step; else pnl.Left += step; break;
        }
        base.OnKeyDown(e);
      }  static void Main()
      {
        Application.Run(new Test());
      }
    }
      

  9.   

    using System.Windows.Forms;class Test : Form
    {
      Panel pnl  = new Panel();
      int   step = 5;  Test()
      {
        Text            = "方向键移位,Shift+方向键改变大小";
        KeyPreview      = true;
        pnl.Parent      = this;
        pnl.BorderStyle = BorderStyle.FixedSingle;
      }  protected override void OnKeyDown(KeyEventArgs e)
      {
        Keys keysMod = Control.ModifierKeys;
        switch (e.KeyCode)
        {
          case Keys.Up   :
            if (keysMod == Keys.Shift) pnl.Height -= step;
            else pnl.Top  -= step;
            break;
          case Keys.Down :
            if (keysMod == Keys.Shift) pnl.Height += step;
            else pnl.Top  += step;
            break;
          case Keys.Left :
            if (keysMod == Keys.Shift) pnl.Width  -= step;
            else pnl.Left -= step;
            break;
          case Keys.Right:
            if (keysMod == Keys.Shift) pnl.Width  += step;
            else pnl.Left += step;
            break;
        }
        base.OnKeyDown(e);
      }  static void Main()
      {
        Application.Run(new Test());
      }
    }