winforms 使用按钮C#调用事件

xqk2d5yq  于 2022-11-17  发布在  C#
关注(0)|答案(2)|浏览(242)

我尝试在按下按钮时调用PaintEventArgs,问题是我不知道如何在不修改按钮事件的情况下调用按钮

private void button_Click(object sender, EventArgs e /*<= PaintEventArgs*/)
    {
        func(e);
        base.OnPaint(e);
    }
t1rydlwq

t1rydlwq1#

您可以调用Invalidate()它将导致控件被重绘

private void button_Click(object sender, EventArgs e /*<= PaintEventArgs*/)
    {
        //func(e); It will be called in the OnPaint method
        Invalidate();
    }

要使用PaintEventArgs,您需要覆盖OnPaint方法

protected override void OnPaint(PaintEventArgs e)
{
   base.OnPaint(e);
   func(e);
}

要实现OnPaint,您需要创建自己的类来继承Button

public class BetterButton : Button{
   public BetterButton() 
   {}
   protected override void OnPaint(PaintEventArgs e) {
      base.OnPaint(e);      
      func(e);
   } 
}
mbzjlibv

mbzjlibv2#

您总是在要绘制的控件的Paint事件上进行绘制。这可能意味着在被重写的OnPaint方法中或在Paint事件处理程序中。为了引发Paint事件,您调用了相应控件的Invalidate方法。您可以不带参数调用它,但在理想情况下,您将计算已经或可能已经更改的最小区域并将其作为Rectangle或类似值传递。
编辑:
下面的示例将在表单的左上角绘制上次记录的时间,并在每次单击Button时更新该时间:

private DateTime time;

private void button1_Click(object sender, EventArgs e)
{
    time = DateTime.Now;
    Invalidate();
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawString(time.ToString(), Font, Brushes.Black, 10, 10);
}

如您所见,您需要在Click事件上做的就是更新数据并使表单无效。所有绘图(包括PaintEventArgs)都在Paint事件处理程序中处理。

相关问题