Как найти четыре координаты и стереть рисунок прямоугольника с резиновой лентой в С#

Привет, я попытался нарисовать прямоугольник с резиновой лентой на форме с помощью мыши в С#.

Проблемы

1) После отпускания мыши прямоугольник исчезает. [Я хочу, чтобы это осталось в форме]

2) Мне также нужно найти координаты четырех точек нарисованного прямоугольника

3) Мне также нужно стереть прямоугольник, чтобы нарисовать новый, когда это необходимо

Форма :

альтернативный текст


КОД

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





}
}

Спасибо за чтение


person Haxed    schedule 05.07.2010    source источник


Ответы (2)


1) После отпускания мыши прямоугольник исчезает. [Я хочу, чтобы это осталось в форме]

Вам необходимо переопределить метод формы OnPaint, чтобы постоянно рисовать прямоугольник. Прямо сейчас вы рисуете его, когда мышь движется, но его нужно рисовать и после этого.

2) Мне также нужно найти координаты четырех точек нарисованного прямоугольника

Они должны быть в ваших переменных ptOriginal и ptLast. Что еще вам нужно?

3) Мне также нужно стереть прямоугольник, чтобы нарисовать новый, когда это необходимо

Просто перестаньте рисовать прямоугольник и нарисуйте новый в OnPaint.

person Reed Copsey    schedule 05.07.2010

Я искал подобную вещь, но был поражен решением, которое я нашел! У вас есть координаты, верно? Вы можете просто использовать VisualBasic PowerPacks, он включен в мою версию Visual Studio 2008.

Вот пример кода, который будет рисовать прямоугольник над TextBox, т.е. я даю ему пользовательскую границу [код]

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 целиком), без рисования, без хлопот !

person CandorZ    schedule 28.12.2010