我发现Graphics和e.Graphics与paint事件有区别。e.Graphics类似于“更专业”,它允许更多地使用转换矩阵。
类似于这个https://msdn.microsoft.com/en-us/library/eews39w7(v=vs.110).aspx的转换
我在写应用程序,会有几个对象。在这个问题中有一个例子C# rotation (transformation) issue
我发现OnPaint方法在这里是如何被高估的,https://msdn.microsoft.com/en-us/library/b818z6z6(v=vs.71).aspx
我不明白的是我应该如何使用它。我需要重写OnPaint方法-好的,但是在什么对象上??
让我们想象一下我将在c#中形成的简单情况
public partial class Form1 : Form {
private Bitmap canvasBitmap; //bitmap for drawing
private Graphics g;
...
public Form1() {
//on Form there is placed PictureBox called canvas
//so canvas is PictureBox 640x480 px
canvasBitmap = new Bitmap(canvas.Width, canvas.Height);
canvas.Image = canvasBitmap;
//prepare graphics
g = Graphics.FromImage(canvasBitmap);
g.SmoothingMode = SmoothingMode.AntiAlias;
...
g.Invalidate();
}
}所有的绘图都将在PictureBox上完成,这将是我的画布。是否可以保留图形g而不是e.Graphics?
比我有一些东西:
List<Fish> fishes = new List<Fish>();
List<Food> food = new List<Food>(); 我想用它们做一些有趣的事情,例如,像这里这样的转换(剥落,平移,旋转) https://msdn.microsoft.com/en-us/library/eews39w7(v=vs.110).aspx
这是物品。我试着写了那个OnPaint方法(不确定它是否在正确的位置)。
class Fish {
Point position;
Fish(int x, int y) {
...
}
protected override void OnPaint(PaintEventArgs e){
...
}
}
class Food {
Point position;
public Food(int x, int y) {
...
}
protected override void OnPaint(PaintEventArgs pe) {
....
}
}问题是:在这种情况下如何使用OnPaint方法?用这个有什么用?我想我可能会像我做的那样,在鱼和食物对象上重写这个方法。我怎么画的?我是怎么重新画的?我是怎么把它放在图形画布上的?应在何处和如何使用无效?
我用的正常
canvas.Invalidate();参见表单示例。我可以混合图形g和e.Graphics吗?e.Graphics也可能会使用一些双重缓冲或类似的东西。
编辑
,E1),那么表单和PicutreBox是控制的?我的鱼食课不受控制?好的?
E2)图片盒上的可以以某种方式达到3张图形,我可以切换到它的平滑绘图。但为了简单我能和一个人在一起吗?好的?
E3)图形g是工具,e.Graphics是一些图形库的包装器,其中包含了一些对转换(使用转换矩阵)的支持。好的?
E4) OnPaint(PaintEventArgs e)将使我能够使用e.Graphics,但是如果我在计时器中有“循环”(在timer对象的句柄中,我只是将其放在表单上并设置句点),然后从它调用更新和更新某些列表中鱼类和食物的所有对象的方法( update =根据我的计算对它们进行转换)。是否有可能在这里使用e.Graphics的方法?
(E5)如果E1是真的话,那么食品和鱼类类中的重写OnPaint方法是无稽之谈,可以吗?
发布于 2016-07-24 07:12:18
e.Graphics来自OnPaint或Paint事件,因此仅用于控件。
您从位图Graphics 创建的对象就是该位图的对象。
你应该使用你真正想要的:在曲面上画或到位图中。
请注意,位图可能显示在控件中,也可能不显示在控件中(曲面下面)。
例如,一个picturebox甚至可以在其表面下显示两个位图,因此您可能希望为此使用三个 Graphics对象。
他们做的相同的事物不同的像素和不,你不能做更多的用一个.!您可以使用任何一个应用矩阵和其他转换。
从e.Graphics参数中获得OnPaint的原因是,系统需要在某些时候以一种形式重新绘制所有控件,因此除了内部控制绘图例程之外,还必须调用绘图代码。
因此,您需要使用此事件和/或其e.Graphics,否则您的绘图将在此重绘时消失。使用e.Graphics绘制控件将使绘图持久化。(*)
另一方面,位图将始终以当前状态显示。不需要重新绘制它们;只需在完成更改后调用Refresh()一次,以便让系统了解它们。
最后:DoubleBuffering是控件的属性,而不是Graphics对象。注意,对于大多数容器,尤其是Panel这样的容器是隐藏的,因此要打开它,需要对它们进行子类化。PictureBox是用来绘图的,DoubleBuffered = true是现成的。
Graphics对象不包含任何图形;它是一个工具,允许您在相关位图(包括控件的图面)上绘图。
(*)请注意,并不是所有的绘图都需要或应该持久:橡皮筋线或矩形不应该这样做,这里使用的是第三种Graphics结构:Graphics g = someControl.CreateGraphics();。
https://stackoverflow.com/questions/38548008
复制相似问题