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方法不能画出一个图案?
展开
 我来答
makosharp
2014-03-25 · TA获得超过676个赞
知道小有建树答主
回答量:188
采纳率:100%
帮助的人:270万
展开全部
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事件中的绘图语句也被正确的执行了。
as56961
2014-03-24 · TA获得超过1131个赞
知道小有建树答主
回答量:319
采纳率:100%
帮助的人:78.2万
展开全部
你把 e.Graphics.DrawImage(bitmap, 0, 0); 这句话拿到button2_Click事件方法里试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式