首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >e.Graphics使用

e.Graphics使用
EN

Stack Overflow用户
提问于 2016-07-24 01:48:18
回答 1查看 3.4K关注 0票数 0

我发现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#中形成的简单情况

代码语言:javascript
复制
 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?

比我有一些东西:

代码语言:javascript
复制
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方法(不确定它是否在正确的位置)。

代码语言:javascript
复制
 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方法?用这个有什么用?我想我可能会像我做的那样,在鱼和食物对象上重写这个方法。我怎么画的?我是怎么重新画的?我是怎么把它放在图形画布上的?应在何处和如何使用无效?

我用的正常

代码语言:javascript
复制
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方法是无稽之谈,可以吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-24 07:12:18

e.Graphics来自OnPaintPaint事件,因此仅用于控件

您从位图Graphics 创建的对象就是该位图的对象。

你应该使用你真正想要的:在曲面上画或到位图中。

请注意,位图可能显示在控件中,也可能不显示在控件中(曲面下面)。

例如,一个picturebox甚至可以在其表面下显示两个位图,因此您可能希望为此使用三个 Graphics对象。

他们做的相同的事物不同的像素和不,你不能做更多的用一个.!您可以使用任何一个应用矩阵和其他转换。

e.Graphics参数中获得OnPaint的原因是,系统需要在某些时候以一种形式重新绘制所有控件,因此除了内部控制绘图例程之外,还必须调用绘图代码。

因此,您需要使用此事件和/或其e.Graphics,否则您的绘图将在此重绘时消失。使用e.Graphics绘制控件将使绘图持久化。(*)

另一方面,位图将始终以当前状态显示。不需要重新绘制它们;只需在完成更改后调用Refresh()一次,以便让系统了解它们。

最后:DoubleBuffering是控件的属性,而不是Graphics对象。注意,对于大多数容器,尤其是Panel这样的容器是隐藏的,因此要打开它,需要对它们进行子类化。PictureBox是用来绘图的,DoubleBuffered = true是现成的。

Graphics对象不包含任何图形;它是一个工具,允许您在相关位图(包括控件的图面)上绘图。

(*)请注意,并不是所有的绘图都需要或应该持久:橡皮筋线或矩形不应该这样做,这里使用的是第三种Graphics结构:Graphics g = someControl.CreateGraphics();

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38548008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档