不使用OnPaint方法绘制椭圆

时间:2009-10-06 09:38:34

标签: c# winforms gdi+

我正在寻找一些GDI教程,但到目前为止我发现的所有内容都适用于OnPaint方法,它将Paintarguments传递给Graphics。我还没有找到如何从头开始,我的意思是如何使用Graphics类本身? 这是我对我不起作用的整个代码:

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);
        }
    }
}

它什么也没做。我尝试了新的形式,没有。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

代码可能没问题,正如你所希望的那样绘制一个椭圆。但是,在Load事件之后,将显示PaintBackground事件和PaintEvent。默认情况下,PaintBackground将删除控件的内容,从而有效地删除刚刚绘制的椭圆。

绘画是一个两阶段的过程:

for each (region in set of regions that need updating)
{
  PaintBackground (region)
  Paint (region)
}

窗口管理器仅重绘需要更新的控件部分,如果控件的内容未更改或用户操作没有更改控件的可见性,则不进行绘制。

那么,为什么要在Load方法中绘制椭圆?通常,您只想在需要绘制某些内容时绘制内容,并在需要绘制PaintBackgroundPaint事件时告知您的表单。

你担心闪烁吗?还是速度问题?椭圆很容易画出来。然而,闪烁难以修复。在Paint事件期间,您需要创建一个位图,绘制位图并将位图blit到控件。此外,使PaintBackground事件不执行任何操作 - 不删除控件,这是导致闪烁的擦除。

编辑:举个例子,我在这里使用DevStudio 2005。

  1. 创建一个新的C#winform应用程序。
  2. 在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 ();
    }
    
  3. 编译并运行。