Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不使用OnPaint方法绘制椭圆_C#_Winforms_Gdi+ - Fatal编程技术网

C# 不使用OnPaint方法绘制椭圆

C# 不使用OnPaint方法绘制椭圆,c#,winforms,gdi+,C#,Winforms,Gdi+,我在看一些GDI教程,但到目前为止,我所发现的一切都与OnPaint方法有关,它将Paintarguments传递给Graphics。我还没有发现如何从头开始,我的意思是如何使用图形类本身? 这是我的treid的全部代码,对我来说根本不起作用: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using Sys

我在看一些GDI教程,但到目前为止,我所发现的一切都与OnPaint方法有关,它将Paintarguments传递给Graphics。我还没有发现如何从头开始,我的意思是如何使用图形类本身? 这是我的treid的全部代码,对我来说根本不起作用:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Pen pen= new Pen(Color.Red, 3);
            Graphics g;
            g = this.CreateGraphics();
    g.DrawEllipse(pen, 150, 150, 100, 100);
        }
    }
}
它只是没有任何作用。我尝试了新的形式,什么都没有


提前谢谢你

代码可能还可以,它正在按照您的期望绘制一个椭圆。但是,在加载事件之后,将出现
PaintBackground
事件和
PaintEvent
表单显示。默认情况下,
PaintBackground
将删除控件的内容,从而有效地删除刚才绘制的椭圆

绘画分为两个阶段:

for each (region in set of regions that need updating)
{
  PaintBackground (region)
  Paint (region)
}
窗口管理器仅重新绘制控件中需要更新的部分,如果控件的内容没有更改,或者没有用户操作改变控件的可见性,则不会进行绘制

那么,为什么要在Load方法中绘制椭圆呢?通常,您只希望在需要绘制某个对象时绘制该对象,并且在
PaintBackground
Paint
事件中,当需要绘制某个对象时,表单会被告知

你担心闪烁吗?还是速度问题?椭圆画起来很快。然而,闪烁更难修复。在绘制事件期间,需要创建位图,绘制到位图并将位图blit到控件。另外,使
PaintBackground
事件不执行任何操作-不要擦除控件,正是擦除导致闪烁

编辑:例如,我在这里使用devstudio2005

  • 创建一个新的C#winform应用程序
  • 在Form1.cs中添加以下内容:

    protected override void OnPaintBackground (PaintEventArgs e)
    {
      // do nothing! prevents flicker
    }
    
    protected override void OnPaint (PaintEventArgs e)
    {
      e.Graphics.FillRectangle (new SolidBrush (BackColor), e.ClipRectangle);
    
      Point
        mouse = PointToClient (MousePosition);
    
      e.Graphics.DrawEllipse (new Pen (ForeColor), new Rectangle (mouse.X - 20, mouse.Y - 10, 40, 20));
    }
    
    protected override void OnMouseMove (MouseEventArgs e)
    {
      base.OnMouseMove (e);
      Invalidate ();
    }
    
  • 编译并运行


  • 代码可能是好的,它正在绘制一个椭圆,正如您所希望的那样。但是,在加载事件之后,将出现
    PaintBackground
    事件和
    PaintEvent
    表单显示。默认情况下,
    PaintBackground
    将删除控件的内容,从而有效地删除刚才绘制的椭圆

    绘画分为两个阶段:

    for each (region in set of regions that need updating)
    {
      PaintBackground (region)
      Paint (region)
    }
    
    窗口管理器仅重新绘制控件中需要更新的部分,如果控件的内容没有更改,或者没有用户操作改变控件的可见性,则不会进行绘制

    那么,为什么要在Load方法中绘制椭圆呢?通常,您只希望在需要绘制某个对象时绘制该对象,并且在
    PaintBackground
    Paint
    事件中,当需要绘制某个对象时,表单会被告知

    你担心闪烁吗?还是速度问题?椭圆画起来很快。然而,闪烁更难修复。在绘制事件期间,需要创建位图,绘制到位图并将位图blit到控件。另外,使
    PaintBackground
    事件不执行任何操作-不要擦除控件,正是擦除导致闪烁

    编辑:例如,我在这里使用devstudio2005

  • 创建一个新的C#winform应用程序
  • 在Form1.cs中添加以下内容:

    protected override void OnPaintBackground (PaintEventArgs e)
    {
      // do nothing! prevents flicker
    }
    
    protected override void OnPaint (PaintEventArgs e)
    {
      e.Graphics.FillRectangle (new SolidBrush (BackColor), e.ClipRectangle);
    
      Point
        mouse = PointToClient (MousePosition);
    
      e.Graphics.DrawEllipse (new Pen (ForeColor), new Rectangle (mouse.X - 20, mouse.Y - 10, 40, 20));
    }
    
    protected override void OnMouseMove (MouseEventArgs e)
    {
      base.OnMouseMove (e);
      Invalidate ();
    }
    
  • 编译并运行


  • 调用CreateGraphics时,必须手动处置已创建的对象,即在完成后调用g.dispose()。调用CreateGraphics时,必须手动处置已创建的对象,即调用g.dispose()如果我总是需要用输入参数重画一些特殊的对象呢?我的窗体跟随鼠标。要跟随鼠标,请处理鼠标移动事件并使窗体无效,这将导致控件重新绘制鼠标移动事件。如果我需要使用输入参数始终重新绘制某些特殊对象,该怎么办?我的窗体正在跟随鼠标。若要跟随鼠标,请处理鼠标移动事件并使窗体无效,这将导致控件重新绘制鼠标移动事件。