我想在的WinForms繪製橢圓用鼠標事件,
當鼠標向下,移動和向上 我的代碼是這樣的:形式閃爍的WinForms
void panel1_MouseDown(object sender, MouseEventArgs e)
{
startpoint.X = e.X;
startpoint.Y = e.Y;
if (m_drawrectiangle == true)
{
m_shape = new Rectiangle(0, 0, this);
m_shape.Xpos = e.X;
m_shape.Ypos = e.Y;
draw = true;
}
if (m_draweliipse == true)
{
m_shape = new Circle(0, 0, this);
m_shape.Xpos = e.X;
m_shape.Ypos = e.Y;
draw = true;
}
}
void panel1_MouseUp(object sender, MouseEventArgs e)
{
if (m_shape != null)
{
if(m_shape.Area()==0)
{
this.Cursor = Cursors.Default;
draw = false;
}
if (draw == true)
{
shapes.Add(m_shape);
this.Cursor = Cursors.Default;
draw = false;
Invalidate();
}
}
}
void panel1_MouseMove(object sender, MouseEventArgs e)
{
this.Text = "(" + e.X + ", " + e.Y + ")";
if (draw==true && m_drawrectiangle==true)
{
int x = (e.X < 0) ? 0 : e.X;
int y = (e.Y < 0) ? 0 : e.Y;
//switch places
m_shape.Xpos = (x < startpoint.X) ? x : startpoint.X;
m_shape.Ypos = (y < startpoint.Y) ? y : startpoint.Y;
((Rectiangle)m_shape).Width = Math.Abs(x - startpoint.X);
((Rectiangle) m_shape).Height = Math.Abs(y - startpoint.Y);
Invalidate(); //re-paint
}
if (draw==true && m_draweliipse==true)
{
int x = (e.X < 0) ? 0 : e.X;
int y = (e.Y < 0) ? 0 : e.Y;
//switch places
m_shape.Xpos = (x < startpoint.X) ? x : startpoint.X;
m_shape.Ypos = (y < startpoint.Y) ? y : startpoint.Y;
double deltax=Math.Pow(x-startpoint.X,2);
double deltay=Math.Pow(y-startpoint.Y,2);
((Circle)m_shape).Diam =(decimal)Math.Sqrt(deltax +deltay);//typecast safe
Invalidate(); //re-paint
}
}
我主要的問題是,當我保存在列表中的圓形或rectinagle,每次我畫一個新的圈子/ rectiangle,在列表中閃爍的形狀...... 這裏我OnPaint事件:
protected override void OnPaint(PaintEventArgs e)
{
if(draw==true)
{
m_shape.draw();
}
if (shapes.Count > 0)
{
foreach (shape a in shapes)
{
a.draw();
if (m_drawarea == true)
{
string text1 = a.Area().ToString("0. 00");
Font font1 = new Font("Arial", 8, FontStyle.Bold, GraphicsUnit.Point);
using (Graphics rectangledraw = CreateGraphics())
{
rectangledraw.DrawString(text1, font1, Brushes.Blue, (float)a.Xpos, (float)a.Ypos);
}
}
}
}
}
有誰能夠告訴我什麼,我做錯了什麼?因爲我不知道該怎麼辦?發生
面板應該雙緩衝以避免看到背景被繪製。你會發現一個在[這個答案](http://stackoverflow.com/questions/3113190/double-buffering-when-not-drawing-in-onpaint-why-doesnt-it-work/3113515#3113515),BufferedPanel類。或者使用PictureBox,默認情況下是雙緩衝。 –