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