Graphics的FillRectangle的问题

sdafslog 2005-04-23 01:53:52
代码如下,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。
...全文
911 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjcking 2005-04-23
  • 打赏
  • 举报
回复
up
sdafslog 2005-04-23
  • 打赏
  • 举报
回复
倒是看明白了,就是如果没有messagebox或doevents的话Paint事件的执行比fillrectangle要晚,这样肯定是不行的拉。感谢Heister大大。但是总觉得无论是MessageBox.Show还是Applicatin.DoeEvents()都不能算是正常的程序设计的流程。MessageBox.Show肯定是干扰了程序使用的,而DoEvents则处理所有消息队列中的消息,如果程序复杂一点,不知道会不会出现别的问题啊。
Heister 2005-04-23
  • 打赏
  • 举报
回复
你吧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");
}
}
singlepine 2005-04-23
  • 打赏
  • 举报
回复
帮你顶一下
新鲜鱼排 2005-04-23
  • 打赏
  • 举报
回复
Heister 2005-04-23
  • 打赏
  • 举报
回复
你如果 是要画背景的话,应该是在 paint 事件里画,要不 paint 事件 会擦除背景的
sdafslog 2005-04-23
  • 打赏
  • 举报
回复
补充一下,是“每个Label都可能同时用到不同的颜色去描绘,只是描绘的Rectangle不同罢了”,所以BackColor没法用啊。
sdafslog 2005-04-23
  • 打赏
  • 举报
回复
不能简单的用BackColor啦。我想做的效果是运行时画出数个Label,然后用DrawaLabel来画,因为每个Label可能会用上不同的颜色去描绘,而且也可能需要修改Text
,所以简单的BackColor肯定是不行的啦。不过现在看来,好像只能用API一点点来画了?
mmqingfeng 2005-04-23
  • 打赏
  • 举报
回复
不是很清楚楼主具体想要什么样的效果,
但如果只是想在drawaLabel()的时候让背景变红的话,
aLabel.BackColor = Color.Red;是最合适的

对于绘制控件,我一般的方法是要么全都自己画,要么全都交给Windows去画,
混和用的时候很容易出现一些诡异的问题

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧