Ошибка с Pen C#
Я сделал систему, чтобы выбрать область с помощью мыши. Тем не менее, когда я выбираю область выглядит следующим образом:
Извините за мой английский, я бразилец...
Мой код:
private void ResizeSelection()
{
if (CurrentAction == ClickAction.LeftSizing)
{
if (Cursor.Position.X < CurrentBottomRight.X - 10)
{
//Erase the previous rectangle
g.DrawRectangle(EraserPen, CurrentTopLeft.X, CurrentTopLeft.Y, RectangleWidth, RectangleHeight);
CurrentTopLeft.X = Cursor.Position.X;
RectangleWidth = CurrentBottomRight.X - CurrentTopLeft.X;
g.DrawRectangle(MyPen, CurrentTopLeft.X, CurrentTopLeft.Y, RectangleWidth, RectangleHeight);
}
}
if (CurrentAction == ClickAction.TopLeftSizing)
{
if (Cursor.Position.X < CurrentBottomRight.X - 10 && Cursor.Position.Y < CurrentBottomRight.Y - 10)
{
//Erase the previous rectangle
g.DrawRectangle(EraserPen, CurrentTopLeft.X, CurrentTopLeft.Y, RectangleWidth, RectangleHeight);
CurrentTopLeft.X = Cursor.Position.X;
CurrentTopLeft.Y = Cursor.Position.Y;
RectangleWidth = CurrentBottomRight.X - CurrentTopLeft.X;
RectangleHeight = CurrentBottomRight.Y - CurrentTopLeft.Y;
g.DrawRectangle(MyPen, CurrentTopLeft.X, CurrentTopLeft.Y, RectangleWidth, RectangleHeight);
}
}
if (CurrentAction == ClickAction.BottomLeftSizing)
{
if (Cursor.Position.X < CurrentBottomRight.X - 10 && Cursor.Position.Y > CurrentTopLeft.Y + 10)
{
//Erase the previous rectangle
g.DrawRectangle(EraserPen, CurrentTopLeft.X, CurrentTopLeft.Y, RectangleWidth, RectangleHeight);
CurrentTopLeft.X = Cursor.Position.X;
CurrentBottomRight.Y = Cursor.Position.Y;
RectangleWidth = CurrentBottomRight.X - CurrentTopLeft.X;
RectangleHeight = CurrentBottomRight.Y - CurrentTopLeft.Y;
g.DrawRectangle(MyPen, CurrentTopLeft.X, CurrentTopLeft.Y, RectangleWidth, RectangleHeight);
}
}
if (CurrentAction == ClickAction.RightSizing)
{
if (Cursor.Position.X > CurrentTopLeft.X + 10)
{
//Erase the previous rectangle
g.DrawRectangle(EraserPen, CurrentTopLeft.X, CurrentTopLeft.Y, RectangleWidth, RectangleHeight);
CurrentBottomRight.X = Cursor.Position.X;
RectangleWidth = CurrentBottomRight.X - CurrentTopLeft.X;
g.DrawRectangle(MyPen, CurrentTopLeft.X, CurrentTopLeft.Y, RectangleWidth, RectangleHeight);
}
}
if (CurrentAction == ClickAction.TopRightSizing)
{
if (Cursor.Position.X > CurrentTopLeft.X + 10 && Cursor.Position.Y < CurrentBottomRight.Y - 10)
{
//Erase the previous rectangle
g.DrawRectangle(EraserPen, CurrentTopLeft.X, CurrentTopLeft.Y, RectangleWidth, RectangleHeight);
CurrentBottomRight.X = Cursor.Position.X;
CurrentTopLeft.Y = Cursor.Position.Y;
RectangleWidth = CurrentBottomRight.X - CurrentTopLeft.X;
RectangleHeight = CurrentBottomRight.Y - CurrentTopLeft.Y;
g.DrawRectangle(MyPen, CurrentTopLeft.X, CurrentTopLeft.Y, RectangleWidth, RectangleHeight);
}
}
if (CurrentAction == ClickAction.BottomRightSizing)
{
if (Cursor.Position.X > CurrentTopLeft.X + 10 && Cursor.Position.Y > CurrentTopLeft.Y + 10)
{
//Erase the previous rectangle
g.DrawRectangle(EraserPen, CurrentTopLeft.X, CurrentTopLeft.Y, RectangleWidth, RectangleHeight);
CurrentBottomRight.X = Cursor.Position.X;
CurrentBottomRight.Y = Cursor.Position.Y;
RectangleWidth = CurrentBottomRight.X - CurrentTopLeft.X;
RectangleHeight = CurrentBottomRight.Y - CurrentTopLeft.Y;
g.DrawRectangle(MyPen, CurrentTopLeft.X, CurrentTopLeft.Y, RectangleWidth, RectangleHeight);
}
}
if (CurrentAction == ClickAction.TopSizing)
{
if (Cursor.Position.Y < CurrentBottomRight.Y - 10)
{
//Erase the previous rectangle
g.DrawRectangle(EraserPen, CurrentTopLeft.X, CurrentTopLeft.Y, RectangleWidth, RectangleHeight);
CurrentTopLeft.Y = Cursor.Position.Y;
RectangleHeight = CurrentBottomRight.Y - CurrentTopLeft.Y;
g.DrawRectangle(MyPen, CurrentTopLeft.X, CurrentTopLeft.Y, RectangleWidth, RectangleHeight);
}
}
if (CurrentAction == ClickAction.BottomSizing)
{
if (Cursor.Position.Y > CurrentTopLeft.Y + 10)
{
//Erase the previous rectangle
g.DrawRectangle(EraserPen, CurrentTopLeft.X, CurrentTopLeft.Y, RectangleWidth, RectangleHeight);
CurrentBottomRight.Y = Cursor.Position.Y;
RectangleHeight = CurrentBottomRight.Y - CurrentTopLeft.Y;
g.DrawRectangle(MyPen, CurrentTopLeft.X, CurrentTopLeft.Y, RectangleWidth, RectangleHeight);
}
}
}
Интересно, есть ли способ исправить это или сделать его прозрачным, показывая только край прямоугольника. Спасибо,
1 ответ
Решение
Вы неправильно используете Graphics
,
Вы никогда не должны звонить CreateGraphics()
рисовать на контроле; это будет стерто на следующей краске.
Вместо этого вы должны обрабатывать Paint
событие и нарисуйте все, что вам нужно на каждом перекрашивании.
Когда мышь двигается, позвоните Invalidate()
заставить его перекрасить.