Как найти четыре координаты и стереть рисунок резинового прямоугольника в C#
Привет, я пытался нарисовать прямоугольник с резинкой на форме с помощью мыши в C#.
Проблемы
1) После отпускания мыши прямоугольник исчезает. [Я хочу, чтобы это оставалось в форме]
2) Мне также нужно найти координаты четырех точек нарисованного прямоугольника
3) Мне также нужно стереть прямоугольник, чтобы нарисовать новый при необходимости
Форма:
http://i46.tinypic.com/9stlcm.jpg
КОД
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace rubberbandrectangle
{
public partial class Form1 : Form
{
Boolean bHaveMouse;
Point ptOriginal = new Point();
Point ptLast = new Point();
public Form1()
{
InitializeComponent();
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
bHaveMouse = true;
ptOriginal.X = e.X;
ptOriginal.Y = e.Y;
ptLast.X = -1;
ptLast.Y = -1;
}
private void MyDrawReversibleRectangle(Point p1, Point p2)
{
Rectangle rc = new Rectangle();
p1 = PointToScreen(p1);
p2 = PointToScreen(p2);
if (p1.X < p2.X)
{
rc.X = p1.X;
rc.Width = p2.X - p1.X;
}
else
{
rc.X = p2.X;
rc.Width = p1.X - p2.X;
}
if (p1.Y < p2.Y)
{
rc.Y = p1.Y;
rc.Height = p2.Y - p1.Y;
}
else
{
rc.Y = p2.Y;
rc.Height = p1.Y - p2.Y;
}
ControlPaint.DrawReversibleFrame(rc,
Color.Red, FrameStyle.Dashed);
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
bHaveMouse = false;
if (ptLast.X != -1)
{
Point ptCurrent = new Point(e.X, e.Y);
MyDrawReversibleRectangle(ptOriginal, ptLast);
}
ptLast.X = -1;
ptLast.Y = -1;
ptOriginal.X = -1;
ptOriginal.Y = -1;
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
Point ptCurrent = new Point(e.X, e.Y);
if (bHaveMouse)
{
if (ptLast.X != -1)
{
MyDrawReversibleRectangle(ptOriginal, ptLast);
}
ptLast = ptCurrent;
MyDrawReversibleRectangle(ptOriginal, ptCurrent);
}
}
private void Form1_Load(object sender, EventArgs e)
{
MouseDown += new MouseEventHandler(Form1_MouseDown);
MouseUp += new MouseEventHandler(Form1_MouseUp);
MouseMove += new MouseEventHandler(Form1_MouseMove);
bHaveMouse = false;
}
}
}
Спасибо за прочтение
2 ответа
1) После отпускания мыши прямоугольник исчезает. [Я хочу, чтобы это оставалось в форме]
Вам необходимо переопределить метод OnPaint формы, чтобы постоянно рисовать прямоугольник. Прямо сейчас вы рисуете его, когда мышь движется, но его также нужно рисовать и после.
2) Мне также нужно найти координаты четырех точек нарисованного прямоугольника
Они должны быть в ваших переменных ptOriginal и ptLast. Что еще нужно?
3) Мне также нужно стереть прямоугольник, чтобы нарисовать новый при необходимости
Просто прекратите рисовать прямоугольник и нарисуйте новый в OnPaint.
Я искал похожую вещь, но был поражен найденным решением! У вас есть координаты правильно? Вы можете просто использовать VisualBasic PowerPacks, он входит в мою версию Visual Studio 2008
Вот пример кода, который будет рисовать прямоугольник над TextBox, т.е. я даю ему настраиваемую границу [code]
Dim x = TextBox1.Location.X
Dim y = TextBox1.Location.Y
Dim width = TextBox1.Width
Dim height = TextBox1.Height
Dim ShapeContainer1 As New Microsoft.VisualBasic.PowerPacks.ShapeContainer
Me.Controls.Add(ShapeContainer1)
Dim RectangleShape1 As New Microsoft.VisualBasic.PowerPacks.RectangleShape
ShapeContainer1.Shapes.AddRange(New Microsoft.VisualBasic.PowerPacks.Shape() {RectangleShape1})
RectangleShape1.Location = New System.Drawing.Point(x - 1, y - 1)
RectangleShape1.Size = New System.Drawing.Size(width + 1, height + 1)
RectangleShape1.BorderColor = Color.MistyRose
ShapeContainer1.Refresh()
Код самоописывается, но если у вас возникнут какие-либо проблемы, просто оставьте сообщение... Да, если вы хотите удалить прямоугольник, просто расположите элементы управления (либо Rectangle, либо ShapeContainer в целом), ни рисования, ни хлопот!