当从另一个表单触发按钮单击事件时,在表单的面板中绘制一个矩形

时间:2018-06-15 10:38:18

标签: c#

我目前正在处理Windows窗体应用程序,其中有两种形式; form1和form2。在form1中有一个按钮,当单击时打开form2,我想要的是在单击Form2中的按钮时在form1的面板内创建一个矩形。我在form2的按钮点击事件中放了一些代码来创建矩形,但点击时没有显示任何内容。但是,每当我将draw.rectangle方法放在单击按钮的同一个窗体中时,它都可以工作,但不同的是

这是form1

中的代码
  private void btnSave_Click(object sender, EventArgs e)
    {
        Layoutsetting a = new Layoutsetting();
        a.ShowDialog();
    }
public void DrawObject()
    {

            Graphics g = panel1.CreateGraphics();
            Rectangle rect = new Rectangle(10, 10, 80, 90);
            rect.Inflate(-10, -10);
            g.DrawRectangle(black, rect);
            g.FillRectangle(Brushes.BlueViolet, rect);
            StringFormat f = new StringFormat();
            f.LineAlignment = StringAlignment.Center;
            f.Alignment = StringAlignment.Center;
            g.DrawString("Hello", this.Font, Brushes.GhostWhite, rect, f);
            panel1.Refresh();
 }

这是form2

中的代码
  private void btnConfirm_Click(object sender, EventArgs e)
    {
        Form1.Default.DrawObject();
        this.Close();
    }

2 个答案:

答案 0 :(得分:0)

您必须为Paint添加方法:

panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.draw);

private void draw(object sender, PaintEventArgs e)
{
    if(buttonClicked) {
        Graphics g = e.Graphics;
        //...
    }
}

答案 1 :(得分:0)

问题不在于绘制矩形,即使面板的最轻微部分被隐藏(例如,其中一部分位于另一个窗体后面)并重新绘制面板,面板绘制事件也会触发,因此矩形消失(但是它是绘制事件不会触发的活动形式,矩形将被绘制,除非您执行需要重新绘制面板的内容,否则不会清除矩形。)。

简易解决方案:

创建一个recangle图像,并在需要时将其用作背景图像,而不是绘制它。

另一种解决方案:

在表单(或面板)中添加属性:

public bool NeedsToBeDrawn {get; set;}

而不是这行代码:

Form1.Default.DrawObject();

将属性设置为true:

   Form1.NeedsToBeDrawn  = true;

并将您的代码移至面板的绘画事件中:

private void panel1_Paint(object sender, PaintEventArgs e)
{
     if(NeedsToBeDrawn)
     {
            Rectangle rect = new Rectangle(10, 10, 80, 90);
            rect.Inflate(-10, -10);
            e.Graphics.DrawRectangle(black, rect);
            e.Graphics.FillRectangle(Brushes.BlueViolet, rect);
            StringFormat f = new StringFormat();
            f.LineAlignment = StringAlignment.Center;
            f.Alignment = StringAlignment.Center;
            e.Graphics.DrawString("Hello", this.Font, Brushes.GhostWhite, rect, f);
     }
}