skip to Main Content

I know this code will work in Visual Studio 2010, but for some reason it is not updating the form in Visual Studio 2022. I alread tried DoubleBuffer and User styles… Any clue what is wrong with this code?

`

namespace Kaledoscópio
{
    public partial class frmMain : Form
    {
        private readonly Random randomColor = new Random();

        public frmMain()
        {
            InitializeComponent();
            tmrStep.Tick += TmrStep_Tick;
            tmrStep.Start();
        }

        private void TmrStep_Tick(object? sender, EventArgs e)
        {
            this.Invalidate();
        }

        private void frmMain_OnPaint(object sender, PaintEventArgs e)
        {
            base.OnPaint(e);

            Graphics g = e.Graphics;

            Color defaultColor = Color.FromArgb(randomColor.Next(255), randomColor.Next(255), randomColor.Next(255));
            using (Pen defaultPen = new Pen(defaultColor, 2))
            {
                int intHeight = this.ClientSize.Height;
                int intWidth = this.ClientSize.Width;

                int intMiddleHeight = intHeight / 2;
                int intMiddleWidth = intWidth / 2;

                Point posTopLeft = new Point(0, 0);
                Point posTopRight = new Point(intWidth, 0);
                Point posBottomLeft = new Point(0, intHeight);
                Point posBottomRight = new Point(intWidth, intHeight);
                Point posMiddle = new Point(intMiddleWidth, intMiddleHeight);
                Point posMiddleTop = new Point(intMiddleWidth, 0);
                Point posMiddleLeft = new Point(0, intMiddleHeight);
                Point posMiddleRight = new Point(intWidth, intMiddleHeight);
                Point posMiddleBottom = new Point(intMiddleWidth, intHeight);

                int defaultStep = randomColor.Next(3, 10);

                int b1;
                for (b1 = 0; b1 <= intMiddleWidth; b1 += defaultStep)
                {
                    g.DrawLine(defaultPen, posTopLeft.X + b1, posTopLeft.Y, posMiddle.X - b1, posMiddle.Y);
                    g.DrawLine(defaultPen, posTopRight.X - b1, posTopRight.Y, posMiddle.X + b1, posMiddle.Y);
                    g.DrawLine(defaultPen, posMiddle.X - b1, posMiddle.Y, posBottomLeft.X + b1, posBottomLeft.Y);
                    g.DrawLine(defaultPen, posMiddle.X + b1, posMiddle.Y, posBottomRight.X - b1, posBottomRight.Y);
                }

                int b2;
                for (b2 = 0; b2 <= intMiddleHeight; b2 += defaultStep)
                {
                    g.DrawLine(defaultPen, posMiddleTop.X, posMiddleTop.Y + b2, posMiddleLeft.X, posMiddleLeft.Y - b2);
                    g.DrawLine(defaultPen, posMiddleTop.X, posMiddleTop.Y + b2, posMiddleRight.X, posMiddleRight.Y - b2);
                    g.DrawLine(defaultPen, posMiddleRight.X, posMiddleRight.Y + b2, posMiddleBottom.X, posMiddleBottom.Y - b2);
                    g.DrawLine(defaultPen, posMiddleLeft.X, posMiddleLeft.Y + b2, posMiddleBottom.X, posMiddleBottom.Y - b2);
                }
            }
        }
    }
}

Actually, it will works if I force a call to Paint() event inside OnPaint() event, but frankly, I don´t think this is the right way to deal with this… Paint() event should be called internally.

2

Answers


  1. Chosen as BEST ANSWER

    Base on your advices I found one solution. No sure about any colletaral effect, but it works.

    I just commented base.OnPaint(e) and it works.

    Here is the final code:

    namespace Kaledoscópio
    {
        public partial class frmMain : Form
        {
            private readonly Random randomColor = new Random();
    
            public frmMain()
            {
                InitializeComponent();
                tmrStep.Tick += TmrStep_Tick;
                tmrStep.Start();
            }
    
            private void TmrStep_Tick(object? sender, EventArgs e)
            {
                this.Refresh();
            }
    
            private void frmMain_Paint(object sender, PaintEventArgs e)
            {
                //base.OnPaint(e);
    
                Graphics g = e.Graphics;
    
                Color defaultColor = Color.FromArgb(randomColor.Next(255), randomColor.Next(255), randomColor.Next(255));
                using (Pen defaultPen = new Pen(defaultColor, 2))
                {
                    int intHeight = this.ClientSize.Height;
                    int intWidth = this.ClientSize.Width;
    
                    int intMiddleHeight = intHeight / 2;
                    int intMiddleWidth = intWidth / 2;
    
                    Point posTopLeft = new Point(0, 0);
                    Point posTopRight = new Point(intWidth, 0);
                    Point posBottomLeft = new Point(0, intHeight);
                    Point posBottomRight = new Point(intWidth, intHeight);
                    Point posMiddle = new Point(intMiddleWidth, intMiddleHeight);
                    Point posMiddleTop = new Point(intMiddleWidth, 0);
                    Point posMiddleLeft = new Point(0, intMiddleHeight);
                    Point posMiddleRight = new Point(intWidth, intMiddleHeight);
                    Point posMiddleBottom = new Point(intMiddleWidth, intHeight);
    
                    int defaultStep = randomColor.Next(3, 10);
    
                    int b1;
                    for (b1 = 0; b1 <= intMiddleWidth; b1 += defaultStep)
                    {
                        g.DrawLine(defaultPen, posTopLeft.X + b1, posTopLeft.Y, posMiddle.X - b1, posMiddle.Y);
                        g.DrawLine(defaultPen, posTopRight.X - b1, posTopRight.Y, posMiddle.X + b1, posMiddle.Y);
                        g.DrawLine(defaultPen, posMiddle.X - b1, posMiddle.Y, posBottomLeft.X + b1, posBottomLeft.Y);
                        g.DrawLine(defaultPen, posMiddle.X + b1, posMiddle.Y, posBottomRight.X - b1, posBottomRight.Y);
                    }
    
                    int b2;
                    for (b2 = 0; b2 <= intMiddleHeight; b2 += defaultStep)
                    {
                        g.DrawLine(defaultPen, posMiddleTop.X, posMiddleTop.Y + b2, posMiddleLeft.X, posMiddleLeft.Y - b2);
                        g.DrawLine(defaultPen, posMiddleTop.X, posMiddleTop.Y + b2, posMiddleRight.X, posMiddleRight.Y - b2);
                        g.DrawLine(defaultPen, posMiddleRight.X, posMiddleRight.Y + b2, posMiddleBottom.X, posMiddleBottom.Y - b2);
                        g.DrawLine(defaultPen, posMiddleLeft.X, posMiddleLeft.Y + b2, posMiddleBottom.X, posMiddleBottom.Y - b2);
                    }
                }
            }
        }
    }
    

  2. Try

    private void TmrStep_Tick(object? sender, EventArgs e)
    {
        this.Refresh();
    }
    

    This will force the repaint of the form. I assume you have the form .Paint event assigned to frmMain_OnPaint() already.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search