高分求解!两个Graphics对象的区别?

ri0wu 2005-03-04 02:59:52
部分程序:
public class MyButtonClass : System.Windows.Forms.Button
{
……
protected override void OnPaint(PaintEventArgs e)
{
Graphics g1 = this.CreateGraphics(), g2 = e.Graphics;
……
}
……
}

请问其中的g1和g2有什么区别?为何只能用g2在该控件上进行绘制,而不能用g1?
拜请各位大虾赐教!高分相赠!
...全文
345 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri0wu 2005-03-04
  • 打赏
  • 举报
回复
这算不算.NET Framework的Bug呢?
ri0wu 2005-03-04
  • 打赏
  • 举报
回复
你指哪个是的?
Jim3 2005-03-04
  • 打赏
  • 举报
回复
是的
ri0wu 2005-03-04
  • 打赏
  • 举报
回复
是不是每个控件默认的Style不同?有的DoubleBuffer开,有的关?
ri0wu 2005-03-04
  • 打赏
  • 举报
回复
你的意思是,由于默认是双缓冲方式,图像先绘制在内存缓冲,但由于被后面的数据冲掉了,所以无法复制到OnScreen。而关掉双缓冲后,直接写屏,就免去了被冲掉的可能,所以能够看到?
Jim3 2005-03-04
  • 打赏
  • 举报
回复
或者可以显示出来,但是立刻就被缓冲区里面的数据覆盖了
(我们的数据写不到缓冲区)
sutalon 2005-03-04
  • 打赏
  • 举报
回复
我测试了一下,若用的自定义控件扩展于 Panel 的话,就没有问题:
public class MyPanel : System.Windows.Forms.Panel
{
……
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint (e);
Graphics g1 = this.CreateGraphics;
……
}
……
}

即使不加下面两句话:
this.SetStyle(ControlStyles.DoubleBuffer ,false);
this.UpdateStyles();

效果与:
Graphics g2 = e.Graphics; 来生成Graphics 一样




Jim3 2005-03-04
  • 打赏
  • 举报
回复
下面是用Reflector看到的WmPaint函数中的一部分
using (GraphicsBuffer buffer1 = this.BufferManager.AllocBuffer(ptr1, rectangle2))
{
Graphics graphics1 = buffer1.Graphics;//注意这里是从GraphicsBuffer得到的
//我们OnPaint使用的就是这个Graphics
//所以我怀疑是对Graphics做了重定向,输入缓冲区
//我们产生的Graphics无法把数据放到缓冲区,所以显示不出来
graphics1.SetClip(rectangle1);
GraphicsState state1 = graphics1.Save();
PaintEventArgs args1 = new PaintEventArgs(graphics1, rectangle1);
this.PaintWithErrorHandling(args1, 1, false);
graphics1.Restore(state1);
this.PaintWithErrorHandling(args1, 2, false);
}
ri0wu 2005-03-04
  • 打赏
  • 举报
回复
等待Jim3(Jim)研究结果,期待中……
sutalon 2005-03-04
  • 打赏
  • 举报
回复
这个可能是 .net gramework 的问题了

不知道
ri0wu 2005-03-04
  • 打赏
  • 举报
回复
只是为何关闭了双缓冲就画出了呢?
sutalon 2005-03-04
  • 打赏
  • 举报
回复
哈哈, ri0wu() ,对不起你了,我上面说的不是很对

恩, Jim3(Jim) 说得不错,高明
ri0wu 2005-03-04
  • 打赏
  • 举报
回复
ok.等待ing
Jim3 2005-03-04
  • 打赏
  • 举报
回复
不清楚原因,正在看,清楚了再说吧
ri0wu 2005-03-04
  • 打赏
  • 举报
回复
谁能解释一下原理阿
chsfly 2005-03-04
  • 打赏
  • 举报
回复
学习.
ri0wu 2005-03-04
  • 打赏
  • 举报
回复
难道原来的话,我一直在offScreen中绘制么?
ri0wu 2005-03-04
  • 打赏
  • 举报
回复
果然可以了,jim3(jim)能解释一下么?
Jim3 2005-03-04
  • 打赏
  • 举报
回复
假如只想画出来的话就容易了
构造函数加上这句
this.SetStyle(ControlStyles.DoubleBuffer ,false);
this.UpdateStyles();
ri0wu 2005-03-04
  • 打赏
  • 举报
回复
自己up一下
加载更多回复(18)

110,539

社区成员

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

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

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