我目前正在处理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();
}
答案 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);
}
}