代码如下,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。

解决方案 »

  1.   

    你吧class a 改成如下 调试 看看 output 打印的是什么就知道了
    你把 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");
    }
    }
      

  2.   

    倒是看明白了,就是如果没有messagebox或doevents的话Paint事件的执行比fillrectangle要晚,这样肯定是不行的拉。感谢Heister大大。但是总觉得无论是MessageBox.Show还是Applicatin.DoeEvents()都不能算是正常的程序设计的流程。MessageBox.Show肯定是干扰了程序使用的,而DoEvents则处理所有消息队列中的消息,如果程序复杂一点,不知道会不会出现别的问题啊。
      

  3.   

    不是很清楚楼主具体想要什么样的效果,
    但如果只是想在drawaLabel()的时候让背景变红的话,
    aLabel.BackColor = Color.Red;是最合适的对于绘制控件,我一般的方法是要么全都自己画,要么全都交给Windows去画,
    混和用的时候很容易出现一些诡异的问题
      

  4.   

    不能简单的用BackColor啦。我想做的效果是运行时画出数个Label,然后用DrawaLabel来画,因为每个Label可能会用上不同的颜色去描绘,而且也可能需要修改Text
    ,所以简单的BackColor肯定是不行的啦。不过现在看来,好像只能用API一点点来画了?
      

  5.   

    补充一下,是“每个Label都可能同时用到不同的颜色去描绘,只是描绘的Rectangle不同罢了”,所以BackColor没法用啊。
      

  6.   

    你如果 是要画背景的话,应该是在 paint 事件里画,要不 paint 事件 会擦除背景的