我目前正在开发 Windows 表单应用程序,其中有两种表单;表格 1 和表格 2。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();
}
问题不在于绘制矩形,只要面板的最细微部分被隐藏(例如,它的一部分在另一个表单后面)就会触发面板绘制事件并重新绘制面板,因此矩形消失(但是当它是如果不触发绘制事件的活动窗体,则矩形将被绘制并且不会被清除,除非您执行某些需要重新绘制面板的操作。)。
简单的解决方案:
创建一个 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);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句