C# 一个关于Graphics类的问题
一个小窗口程序,在按钮的事件里写了以下代码,想通过按键画一个红色的方块:privatevoidbutton2_Click(objectsender,EventArgse)...
一个小窗口程序,在按钮的事件里写了以下代码,想通过按键画一个红色的方块:
private void button2_Click(object sender, EventArgs e)
{
this.bitmap = new Bitmap(500, 500);
Graphics vGraphics = Graphics.FromImage(bitmap);
vGraphics.FillRectangle(new SolidBrush(Color.Red), vGraphics.ClipBounds);
}
运行后点击按钮没有反应,要在后面加上Invalidate()函数,并重写了OnPaint方法才能达到目的。
Onpaint方法是这样写的:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (bitmap != null) e.Graphics.DrawImage(bitmap, 0, 0);
}
求高手指教,为什么不加上Invalidate方法和重写Onpaint方法不能画出一个图案? 展开
private void button2_Click(object sender, EventArgs e)
{
this.bitmap = new Bitmap(500, 500);
Graphics vGraphics = Graphics.FromImage(bitmap);
vGraphics.FillRectangle(new SolidBrush(Color.Red), vGraphics.ClipBounds);
}
运行后点击按钮没有反应,要在后面加上Invalidate()函数,并重写了OnPaint方法才能达到目的。
Onpaint方法是这样写的:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (bitmap != null) e.Graphics.DrawImage(bitmap, 0, 0);
}
求高手指教,为什么不加上Invalidate方法和重写Onpaint方法不能画出一个图案? 展开
2个回答
展开全部
Graphics相当于可视控件的呈现表面。
如果是从PaintEventArgs绘图事件中的e.Graphics而来,你取到的正是系统准备在上面绘画的Graphics对象;
如果你自己创建了一个,它仅仅是在内存中而已,无法显示出来。
在进行重绘工作时,通常使用两种方式来获取合适的Graphics,
一是在各类绘图事件中写,要求该事件提供PaintEventArgs;
二是直接获取某控件的Graphics。比如你可以在button2_click事件中写:
Graphics btnGraph=button2.CreateGraphics();
btnGraph.FillRectangle(new SolidBrush(Color.Red), vGraphics.ClipBounds);
要注意一点,不写在合适重绘事件中,你的“画布”很可能只画了一次然后就被抹的乱七八糟。比如窗体缩放、窗体拖动、窗体隐藏等等,都会导致OnPaint事件,结果就是系统又给你画回来了。
至于Invalidate,是要求控件立刻重绘区域,会触发控件的OnPaint事件的,所以你写在OnPaint事件中的绘图语句也被正确的执行了。
如果是从PaintEventArgs绘图事件中的e.Graphics而来,你取到的正是系统准备在上面绘画的Graphics对象;
如果你自己创建了一个,它仅仅是在内存中而已,无法显示出来。
在进行重绘工作时,通常使用两种方式来获取合适的Graphics,
一是在各类绘图事件中写,要求该事件提供PaintEventArgs;
二是直接获取某控件的Graphics。比如你可以在button2_click事件中写:
Graphics btnGraph=button2.CreateGraphics();
btnGraph.FillRectangle(new SolidBrush(Color.Red), vGraphics.ClipBounds);
要注意一点,不写在合适重绘事件中,你的“画布”很可能只画了一次然后就被抹的乱七八糟。比如窗体缩放、窗体拖动、窗体隐藏等等,都会导致OnPaint事件,结果就是系统又给你画回来了。
至于Invalidate,是要求控件立刻重绘区域,会触发控件的OnPaint事件的,所以你写在OnPaint事件中的绘图语句也被正确的执行了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询