【问题标题】:Groupbox redraw issueGroupbox重绘问题
【发布时间】:2012-11-16 01:40:29
【问题描述】:

我觉得我已经在互联网上搜寻了答案,但我仍然没有解决这个问题。 我正在用 C# 构建一个刽子手游戏(我还是新手),我的表单上有一个组框,我在其中绘制不同的“身体部位”。问题是每次调用 draw 事件时都会重新绘制它。所以我最终会得到一个头,然后是一条手臂,一条腿,等等。

我尝试过覆盖 OnPaintBackground 之类的操作,虽然这解决了重绘问题,但它搞砸了整个表单,而且当我这样做时看起来很糟糕。 我也尝试在面板而不是组框上绘图,但由于某种原因,我什至无法绘制。

有人可以提供任何建议吗? 顺便说一句,这不是家庭作业,只是个人项目和学习经历。

一些代码:这是我用来触发绘图功能的(它在我拥有的其他条件下触发)

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

    }

【问题讨论】:

    标签: c# paint redraw


    【解决方案1】:

    您的 If 语句有两点。它们被设置为仅在计数等于计数时才激活,因此当计数小于阈值时您不会重绘,第二件事是使用 else 语句您只运行一个级别。在您的 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);
        }
    
    }
    

    【讨论】:

    • 感谢您的回复。我什至没有想过这样做,主要是因为我一开始就试图修复它。这工作得很好,即使它每次都重绘零件。不过我还是很好奇。他们是否是一种更好的方法来做到这一点,您不需要多次重绘相同的部分?我认为它与 OnPaint 和 OnPaintBackground 调用有关。
    • @AarinCovyeau 如果表单无效,绘图例程将必须能够绘制完整的图片,我知道减轻一些绘图的唯一方法是创建区域并且仅当你改变你的状态时使它们失效,但你仍然需要像我上面给你的代码或者创建一个位图绘制然后更新一个图片框或用图像模拟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2011-11-05
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多