我正在寻找一些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);
}
}
}
它什么也没做。我尝试了新的形式,没有。
提前谢谢!
答案 0 :(得分:1)
代码可能没问题,正如你所希望的那样绘制一个椭圆。但是,在Load事件之后,将显示PaintBackground
事件和PaintEvent
。默认情况下,PaintBackground
将删除控件的内容,从而有效地删除刚刚绘制的椭圆。
绘画是一个两阶段的过程:
for each (region in set of regions that need updating)
{
PaintBackground (region)
Paint (region)
}
窗口管理器仅重绘需要更新的控件部分,如果控件的内容未更改或用户操作没有更改控件的可见性,则不进行绘制。
那么,为什么要在Load方法中绘制椭圆?通常,您只想在需要绘制某些内容时绘制内容,并在需要绘制PaintBackground
和Paint
事件时告知您的表单。
PaintBackground
事件不执行任何操作 - 不删除控件,这是导致闪烁的擦除。
编辑:举个例子,我在这里使用DevStudio 2005。
在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 ();
}
编译并运行。