Проблем с преначертаването на Groupbox

Имам чувството, че съм преровил интернет за отговор, но все още не съм решил този проблем. Създавам игра на палач в C# (която все още съм нов) и имам групова кутия във формуляра си, където рисувам различните „части на тялото“. Проблемът е, че се преначертава всеки път, когато се извика събитието за теглене. Така че в крайна сметка ще имам глава, след това само ръка, крак и т.н.

Опитах се да правя неща като замяна на 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);
        }         

    }

person Aarin Covyeau    schedule 16.11.2012    source източник


Отговори (1)


Да, Илвар, но не искам картите на сайта да вземат сайт оттам. Бих искал да посоча личния си основен URL адрес. Сега върнете: api.mydomain.me/page/3232 (api.mydomains.me това е активният сайт), но това, което искам, е: mydomain.com/page/3213 Разбирате ли?
person Mark Hall    schedule 16.11.2012
comment
Благодаря за отговора. Дори не се бях замислял да го направя по този начин, най-вече защото се опитвах да го поправя с изчистването на първо място. Това обаче работи доста добре, дори ако преначертава частите всеки път. Все пак съм любопитен. Техният по-добър начин да направите това ли е, когато няма нужда да преначертавате едни и същи части повече от веднъж? Предполагам, че е свързано с извикванията OnPaint и OnPaintBackground. - person Aarin Covyeau; 16.11.2012
comment
@AarinCovyeau Рутината за рисуване ще трябва да може да начертае пълната картина, ако формулярът е невалиден. Единствените начини, които знам за облекчаване на част от чертежа, са да се създадат региони и да се обезсилят само когато промените състоянието си, но все пак ще трябва да имате код, както ви дадох по-горе, или да създадете растерна графика за това, след което да актуализирате картинна кутия или симулар с изображението. - person Mark Hall; 16.11.2012