代码如下,class a用来在运行时画一个Label,然后定义两个方法一个改text,一个做fill
private void button1_Click(object sender, System.EventArgs e)
{
b=new a(panel1);
//b.settext();
} private void button2_Click(object sender, System.EventArgs e)
{
b.settext();
//MessageBox.Show("ss");
b.drawaLabel();
} }
public class a
{
private Label aLabel=new Label();
private Graphics g;
public Rectangle rect=new Rectangle();
public a(Control far)
{
aLabel.Name="a";
aLabel.Top=10;
aLabel.Left=20;
aLabel.Height=30;
aLabel.Width=40;
aLabel.BorderStyle=BorderStyle.FixedSingle;
aLabel.Parent=far;
aLabel.Text="exp";
g=aLabel.CreateGraphics();
rect=aLabel.ClientRectangle;
}
public void settext()
{
aLabel.Text="draw";
}
public void drawaLabel()
{
g.FillRectangle(new SolidBrush(Color.Red),rect);
} } 其中的b.settext()如果在button_click调用,button2_click只有drawaLabel时一切正常,但如果在button2_click里连着写上settext和drawaLabel时,drawaLabel就没用。但如果在两者之间加上MessageBox.Show,就也正常。估计跟aLabel的paint事件有关,但没搞清楚是什么关系?为什么加一条message就没事了?哪位大大清楚其中关系的答疑解惑啊。郁闷ing。
private void button1_Click(object sender, System.EventArgs e)
{
b=new a(panel1);
//b.settext();
} private void button2_Click(object sender, System.EventArgs e)
{
b.settext();
//MessageBox.Show("ss");
b.drawaLabel();
} }
public class a
{
private Label aLabel=new Label();
private Graphics g;
public Rectangle rect=new Rectangle();
public a(Control far)
{
aLabel.Name="a";
aLabel.Top=10;
aLabel.Left=20;
aLabel.Height=30;
aLabel.Width=40;
aLabel.BorderStyle=BorderStyle.FixedSingle;
aLabel.Parent=far;
aLabel.Text="exp";
g=aLabel.CreateGraphics();
rect=aLabel.ClientRectangle;
}
public void settext()
{
aLabel.Text="draw";
}
public void drawaLabel()
{
g.FillRectangle(new SolidBrush(Color.Red),rect);
} } 其中的b.settext()如果在button_click调用,button2_click只有drawaLabel时一切正常,但如果在button2_click里连着写上settext和drawaLabel时,drawaLabel就没用。但如果在两者之间加上MessageBox.Show,就也正常。估计跟aLabel的paint事件有关,但没搞清楚是什么关系?为什么加一条message就没事了?哪位大大清楚其中关系的答疑解惑啊。郁闷ing。
你把 MessageBox.Show 改成 Application.DoEvents();也是一样的我想原因是 paint 事件 的优先级比较低
再你调用settext后,会引发一个paint事件, 但由于下面 还有
drawaLabel 函数要调用,所以 不会马上 调用paint 事件,等drawlabel 调用完后,才会调用paint, 就把你设定的 text 画出来,画 text的时候,你的颜色自然就没有了
如果注释掉MessageBox.Show, 然后连续按2次 button2_click ,就会发现drawaLabel 有用了,因为 第二次按时因为 aLabel的文本没有变,所以不会引发paint事件,但你 如果每按一次 button2_click ,就画不同的 字符,drawaLabel 还是没用的加Application.DoEvents(); 就行了 时因为 这条语句 会让程序先 去处理完消息,MessageBox.Show也是一样的
说得很乱,不知道你弄清楚了没有 public class a
{
private Label aLabel=new Label();
private Graphics g;
public Rectangle rect=new Rectangle();
public a(Control far)
{
aLabel.Name="a";
aLabel.Top=10;
aLabel.Left=20;
aLabel.Height=30;
aLabel.Width=40;
aLabel.BorderStyle=BorderStyle.FixedSingle;
aLabel.Parent=far;
aLabel.Text="exp";
g=aLabel.CreateGraphics();
rect=aLabel.ClientRectangle;
aLabel.Paint +=new PaintEventHandler(aLabel_Paint);
}
public void settext()
{
aLabel.Text="draw";
Console.WriteLine("settext");
}
public void drawaLabel()
{
g.FillRectangle(new SolidBrush(Color.Red),rect);
Console.WriteLine("drawaLabel");
} private void aLabel_Paint(object sender, PaintEventArgs e)
{
Console.WriteLine("paint");
}
}
但如果只是想在drawaLabel()的时候让背景变红的话,
aLabel.BackColor = Color.Red;是最合适的对于绘制控件,我一般的方法是要么全都自己画,要么全都交给Windows去画,
混和用的时候很容易出现一些诡异的问题
,所以简单的BackColor肯定是不行的啦。不过现在看来,好像只能用API一点点来画了?