winforms 如何从KeyDown方法中使用PaintEventArgs调用方法

41ik7eoe  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(144)

我正在学习表单应用程序,对整个流程非常陌生。我想在屏幕上画一些东西(line),但我不知道如何将PaintEventArgs解析为方法。我读过不同的帖子,但我不明白我实际上应该做什么。大多数人说使用PictureBox尝试了一些事情,但无法从KeyDown方法调用paint。
我还在InitializeComponent中添加了KeyDown方法。
this.KeyDown += new KeyEventHandler(this.Form1_KeyDown);
先谢谢你。
编码:

private void Form1_KeyDown(object sender, KeyEventArgs ke)
{
    if (ke.KeyCode == Keys.Space)
    {
        Custom_Paint(sender, needPaintEventArgsHere);
    }
}

private void Custom_Paint(object sender, PaintEventArgs pe)
{
    Graphics g = pe.Graphics;
    Pen blackPen = new Pen(Color.Black, 1);

    pe.Graphics.DrawLine(blackPen, 200.0F, 400.0F, 500.0F, 700.0F);
}
sg3maiej

sg3maiej1#

当从Form类继承时,不需要订阅KeyDownKeyUpPaint等事件,而是应该覆盖相应的方法OnKeyDownOnKeyUpOnPaint。您应该在被覆盖的OnPaint方法中编写绘制逻辑,并直接在通过PaintEventArgs.Graphics传递的Graphics对象上进行绘制。只需调用Control.Invalidate来触发OnPaint方法。
此外,您可能希望为Form启用双缓冲,如构造函数中所示。

public partial class Form1: Form
{
   private bool m_isSpaceKeyPressed = false;
   public Form1()
   {
       SetStyle(ControlStyle.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
       InitializeComponent();
   }
   protected override void OnPaint(object sender, PaintEventArgs e)
   {
       base.OnPaint(e);
       if(!m_isSpaceKeyPressed)
          return;
       Graphics g = e.Graphics;
       Pen blackPen = new Pen(Color.Black, 1);

       g.Graphics.DrawLine(blackPen, 200.0F, 400.0F, 500.0F, 700.0F);
   }
   protected override void OnKeyDown(KeyEventArgs e)
   {
       if (e.KeyCode == Keys.Space)
       {
           m_isSpaceKeyPressed = true;
           Invalidate();
       }
   }
   protected override void OnKeyUp(KeyEventArgs e)
   {
       if (e.KeyCode == Keys.Space)
       {
           m_isSpaceKeyPressed = false;
           Invalidate();
       }
   }
}

相关问题