C# System.Drawing реализация перетаскивания нарисованного объекта

Пытаюсь написать игру Морской бой, с графической частью возникли проблемы. Все работает как я и хотел, но при движении мыши с захваченным кораблем перерисовывается вся панель с использованием команды Panel.Refresh(). Очевидно, так делать неправильно, но для наглядности оставил. Хочу узнать, как сделать, чтобы перерисовывался только прямоугольник корабля, который пользователь в данный момент перетаскивает, тогда панель не будет мерцать.

public partial class Form1 : Form{
    int draggedShipCoordX, draggedShipCoordY;
    bool shipDragged = false;

    Rectangle rect1 = new Rectangle(0, 60, 160, 40);

        private void panel2_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = shipsPlacementPanel.CreateGraphics();
            Pen dottedPen = new Pen(Color.Black, 1);
            dottedPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
            g.DrawRectangle(new Pen(ColorTranslator.FromHtml("#00f"), 2), rect1); //4
            g.FillRectangle(new SolidBrush(Color.FromArgb(10, 0, 0, 255)), rect1);


            g.DrawRectangle(dottedPen, 0, 60, 160, 40); //Контуры для размещения перетаскиваемых кораблей

            g.DrawRectangle(dottedPen, 0, 140, 120, 40); //3
            g.DrawRectangle(dottedPen, 160, 140, 120, 40);

            g.DrawRectangle(dottedPen, 0, 220, 80, 40); //2
            g.DrawRectangle(dottedPen, 120, 220, 80, 40);
            g.DrawRectangle(dottedPen, 240, 220, 80, 40);

            g.DrawRectangle(dottedPen, 0, 300, 40, 40); 
            g.DrawRectangle(dottedPen, 80, 300, 40, 40);
            g.DrawRectangle(dottedPen, 160, 300, 40, 40);
            g.DrawRectangle(dottedPen, 240, 300, 40, 40);
        }

        

        private void shipsPlacementPanel_MouseMove(object sender, MouseEventArgs e)
        {
            Graphics g = shipsPlacementPanel.CreateGraphics();
            System.Drawing.Drawing2D.GraphicsContainer ct = g.BeginContainer();
            if (shipDragged) {
                rect1.Offset(new Point(e.X - rect1.X - draggedShipCoordX,e.Y - rect1.Y - draggedShipCoordY));
                //rect1.X = e.X - draggedShipCoordX;
                //rect1.Y = e.Y - draggedShipCoordY;
                //g.DrawRectangle(new Pen(ColorTranslator.FromHtml("#00f"), 2), e.X - draggedShipCoordX + 1, e.Y - draggedShipCoordY, 159, 40); //4
                shipsPlacementPanel.Refresh();
            }

        }

        private void shipsPlacementPanel_MouseUp(object sender, MouseEventArgs e)
        {
            Graphics g = shipsPlacementPanel.CreateGraphics();
            shipDragged = false;
            rect1.X = 0;
            rect1.Y = 60;
            
            g.DrawRectangle(new Pen(ColorTranslator.FromHtml("#00f"), 2), 1, 60, 159, 40); //4
            g.FillRectangle(new SolidBrush(Color.FromArgb(10, 0, 0, 255)), 1, 60, 159, 40);

            Refresh();
        }

        private void shipsPlacementPanel_DragEnter(object sender, DragEventArgs e)
        {
            
        }

        private void shipsPlacementPanel_MouseDown(object sender, MouseEventArgs e)
        {
            Graphics g = shipsPlacementPanel.CreateGraphics();
            if (rect1.Contains(e.X, e.Y)) {
                //g.DrawLine(new Pen(Color.Red, 2), new Point(0, 60), new Point(e.X, e.Y));
                draggedShipCoordX = e.X % 160;
                draggedShipCoordY = (e.Y - 60) % 40;
                shipDragged = true;
            }
        }
}

Ответы (0 шт):