2012-11-16 75 views
1

我觉得我已经在互联网上寻找答案,但我仍然没有解决这个问题。 我正在用C#构建一个hang子手游戏(我还是新来的),并且我在表单上绘制了不同的“body部分”。问题在于每次绘图事件被调用时都会重绘。所以我最终会得到一个头,然后只是一个胳膊,一条腿等Groupbox重绘问题

我试图做像重写OnPaintBackground这样的事情,虽然这解决了重绘的问题,它拧了起来整个形式,当我这样做时,它看起来很糟糕。 我也尝试绘制到一个面板而不是一个groupbox,但由于某种原因,我无法让它画出来。

任何人都可以提供任何建议吗? 这不是作业顺便,只是一个个人项目和学习经验。

一些代码:这是我使用触发绘制函数(它会触发对我有其他条件)

this.groupBoxHang.Paint += new System.Windows.Forms.PaintEventHandler(this.groupBoxHangMan_Paint); 

然后说到这里,它调用实际的功能,这是什么一个单独的类

private void groupBoxHangMan_Paint(object sender, PaintEventArgs e) 
    {   
     draw.DrawHangMan(e.Graphics, GetRemainingGuess());  
    } 

下面是其他类的一部分:

public void DrawHangMan(Graphics dM, int guessesRemaining) 
    {   
     Pen blackPen = new Pen(Brushes.Black); 

     Pen deathPen = new Pen(Brushes.Red); 
     deathPen.Width = 2.0F; 

     if (guessesRemaining == 7) 
     { 
      dM.DrawEllipse(blackPen, 94, 75, 60, 60);//head 
     } 
     else if (guessesRemaining == 6) 
     { 
      dM.DrawLine(blackPen, 124, 210, 124, 135);//body 
     } 
     else if (guessesRemaining == 5) 
     { 
      dM.DrawLine(blackPen, 123, 170, 65, 145);//left arm 
     } 
     else if (guessesRemaining == 4) 
     { 
      dM.DrawLine(blackPen, 123, 170, 181, 145); //right arm 
     } 
     else if (guessesRemaining == 3) 
     { 
      dM.DrawLine(blackPen, 123, 210, 65, 255);//left leg 
     } 
     else if (guessesRemaining == 2) 
     { 
      dM.DrawLine(blackPen, 123, 210, 181, 255);//right leg 
     } 
     else if (guessesRemaining == 1) 
     { 
      dM.DrawEllipse(blackPen, 105, 93, 10, 10); //left open eye 
      dM.DrawEllipse(blackPen, 133, 93, 10, 10); //right open eye 
     } 
     else if (guessesRemaining == 0) 
     { 
      dM.DrawLine(deathPen, 102, 104, 118, 92);//left eye dead 
      dM.DrawLine(deathPen, 118, 104, 102, 92); 

      dM.DrawLine(deathPen, 130, 104, 146, 92);//right dead eye 
      dM.DrawLine(deathPen, 146, 104, 130, 92); 
     }   

    } 

回答

0

两件事用你的If语句。它们被设置为只在计数等于计数时激活,以便在计数小于阈值时不会重新绘制,第二件事是用其他语句只运行其中一个级别。在Paint事件中执行此操作是正确的。尝试这样的:

public void DrawHangMan(Graphics dM, int guessesRemaining) 
{ 
    Pen blackPen = new Pen(Brushes.Black); 
    Pen deathPen = new Pen(Brushes.Red); 
    deathPen.Width = 2.0F; 

    if (guessesRemaining < 8) 
    { 
     dM.DrawEllipse(blackPen, 94, 75, 60, 60);//head 
    } 
    if (guessesRemaining < 7) 
    { 
     dM.DrawLine(blackPen, 124, 210, 124, 135);//body 
    } 
    if (guessesRemaining < 6) 
    { 
     dM.DrawLine(blackPen, 123, 170, 65, 145);//left arm 
    } 
    if (guessesRemaining < 5) 
    { 
     dM.DrawLine(blackPen, 123, 170, 181, 145); //right arm 
    } 
    if (guessesRemaining < 4) 
    { 
     dM.DrawLine(blackPen, 123, 210, 65, 255);//left leg 
    } 
    if (guessesRemaining < 3) 
    { 
     dM.DrawLine(blackPen, 123, 210, 181, 255);//right leg 
    } 
    if (guessesRemaining < 2) 
    { 
     dM.DrawEllipse(blackPen, 105, 93, 10, 10); //left open eye 
     dM.DrawEllipse(blackPen, 133, 93, 10, 10); //right open eye 
    } 
    if (guessesRemaining < 1) 
    { 
     dM.DrawLine(deathPen, 102, 104, 118, 92);//left eye dead 
     dM.DrawLine(deathPen, 118, 104, 102, 92); 
     dM.DrawLine(deathPen, 130, 104, 146, 92);//right dead eye 
     dM.DrawLine(deathPen, 146, 104, 130, 92); 
    } 

} 
+0

感谢您的答复。我甚至没有想过这样做,主要是因为我试图首先解决这个问题。尽管它每次都重新绘制部件,但这种方法很好。我仍然很好奇。他们更好的方式来做到这一点,你不需要重复绘制相同的部分不止一次?我认为它必须处理OnPaint和OnPaintBackground调用。 –

+0

@AreaCovyeau如果表单无效,绘图例程必须能够绘制出完整的图片。我知道减少绘图的唯一方法是创建区域,并且只有在您更改状态时才使其失效,但是你仍然需要像上面给出的代码那样创建一个代码,或者创建一个Bitmap,然后更新一个图片框或者图片。 –