C# 不使用OnPaint方法绘制椭圆
我在看一些GDI教程,但到目前为止,我所发现的一切都与OnPaint方法有关,它将Paintarguments传递给Graphics。我还没有发现如何从头开始,我的意思是如何使用图形类本身? 这是我的treid的全部代码,对我来说根本不起作用: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
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
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
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()如果我总是需要用输入参数重画一些特殊的对象呢?我的窗体跟随鼠标。要跟随鼠标,请处理鼠标移动事件并使窗体无效,这将导致控件重新绘制鼠标移动事件。如果我需要使用输入参数始终重新绘制某些特殊对象,该怎么办?我的窗体正在跟随鼠标。若要跟随鼠标,请处理鼠标移动事件并使窗体无效,这将导致控件重新绘制鼠标移动事件。