各位大侠,小弟想写个俄罗斯方块,有两个地方不是很明白:
1.在一个Form里添加两个panel和几个button,再为Form添加KeyDown事件的处理方法,但是在运行后当按键时貌似没有执行方法,而是在几个button之间进行切换,按下的键是键盘的上下左右键(用来控制移动方向和变形),这是为什么?
2.还有,如果为两个panel添加Paint事件的处理方法,那是在什么时候执行?对Paint时间不是很理解,希望大家能多介绍一下~~

解决方案 »

  1.   

    1.若要仅在窗体级别处理键盘事件而不允许其他控件接收键盘事件,请将窗体的 KeyPress 事件处理方法中的 KeyPressEventArgs.Handled 属性设置为 true。
      

  2.   

    Form上放一个picturebox,编写他的keydown等事件
      

  3.   

    1.Form1.KeyPreview = true;请设置窗体的 KeyPreview 属性为 true :当此属性设置为 true 时,窗体将接收所有 KeyPress、KeyDown 和 KeyUp 事件。在窗体的事件处理程序处理完该击键后,然后将该击键分配给具有焦点的控件。例如,如果 KeyPreview 属性设置为 true,而且当前选定的控件是 TextBox,则在窗体的事件处理程序处理了击键后,TextBox 控件将接收所按的键。要仅在窗体级别处理键盘事件并且不允许控件接收键盘事件,请将窗体的 KeyPress 事件处理程序中的 KeyPressEventArgs.Handled 属性设置为 true。
      

  4.   

    2.Control.Paint 事件在重绘控件时发生。比如说,当窗体最小化后又还原时,或者被其他窗体遮挡后又重新可见时。当然,Control.Refresh() 方法也会强制控件使其工作区无效并立即重绘自己和任何子控件。
      

  5.   

    先谢谢了但Form1.KeyPreview本来就是true呀,好像我按下某个键后并没有执行form的KeyDown方法
      

  6.   

    按其他按键是可以触发keypress事件的,但上下左右四个键除外。
    建议将按钮的tabstop设置为false。
      

  7.   

    // 命令键是始终比常规输入键具有优先权的键。命令键的示例包括快捷键和菜单快捷方式。
    // 在派生类中重写 ProcessCmdKey 方法时,控件应返回 true 以指示它已处理该键。
    // 对于未由该控件处理的键,应返回调用基类的 ProcessCmdKey 方法的结果。using System.Windows.Forms;class Test : Form
    {
      protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
      {
        switch (keyData)
        {
          case Keys.Apps              : // 应用程序键
          case Keys.RWin              : // 右 Win 键
          case Keys.Menu | Keys.Alt   : // Alt 键
          case Keys.F4   | Keys.Shift : // Shift-F4 键
            MessageBox.Show("Key Press : " + keyData);
            return true;
        }
        return base.ProcessCmdKey (ref msg, keyData);
      }  static void Main()
      {
        Application.Run(new Test());
      }
    }
      

  8.   

    // 可以用 msg.LParam 来区分左右 Alt, Ctrl, Shift, 两个Enter 键using System.Windows.Forms;class Test : Form
    {
      protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
      {
        string s = string.Empty;
        switch ((int)msg.LParam)
        {
          case 0x20380001 : s = "LAlt"    ; break;
          case 0x21380001 : s = "RAlt"    ; break;
          case 0x001d0001 : s = "LControl"; break;
          case 0x011d0001 : s = "RControl"; break;
          case 0x002a0001 : s = "LShift"  ; break;
          case 0x00360001 : s = "RShift"  ; break;
          case 0x001c0001 : s = "Enter"   ; break;
          case 0x011c0001 : s = "PadEnter"; break;
        }
        MessageBox.Show(msg + "\r\n" + keyData + "\r\n" + s);
        return base.ProcessCmdKey(ref msg, keyData);
      }  static void Main()
      {
        Application.Run(new Test());
      }
    }
      

  9.   

    楼上写的看不太懂,我就是想让程序在按下“上下左右”四个键时发生响应,执行frm_KeyDown方法,大家有什么办法吗?先谢了~
      

  10.   

    using System.Windows.Forms;class Test : Form
    {
      protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
      {
        switch (keyData)
        {
          case Keys.Up   : // 上
          case Keys.Down : // 下
          case Keys.Left : // 左
          case Keys.Right: // 右
            MessageBox.Show("您按下了 : " + keyData);
            return true;
        }
        return base.ProcessCmdKey (ref msg, keyData);
      }  static void Main()
      {
        Application.Run(new Test());
      }
    }
      

  11.   

    楼主看来是初学
    那么就这样吧protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
            {
                switch (keyData)
                {
                    case Keys.Up: // 上
                    case Keys.Down: // 下
                    case Keys.Left: // 左
                    case Keys.Right: // 右
                        frm_KeyDown(this, new KeyEventArgs(keyData));
                      return true;
                }
                return base.ProcessCmdKey(ref msg, keyData);
            }