1

Тема: Малювання label вліво-вверх

Необхідно малювати label від місця, де натискається ЛКМ, і до моменту відпускання. Коли я протягую мишу в право-вниз, то все працює. Але я вирішила ускладнити задачу і додати можливість малювати у протилежному напрямку, тобто вліво-вверх, і вже при протягуванні label не зʼявляється. Виводила значення width, height (у іншу label), то вони нульові (коли протягувати вліво-вверх), але коли потім мишку знову тягнути вниз-вправо, то малюється, але координати початку зміщені до тої точки, де була мишка востаннє під час руху вверх-вліво.
В чому  може бути проблема?

Прихований текст

public partial class Form4 : Form
{
    int start_x;
    int start_y;
    int end_x;
    int end_y;
    Label label;
    bool draw = false;

    public Form4()
    {
        InitializeComponent();
        start_x = 0;
        start_y = 0;
        end_x = 0;
        end_y = 0;
    }

    private Label CreateLabel(int s_x, int s_y, int e_x, int e_y)
    {
        Label label = new Label();

        if (s_x < e_x && s_y < e_y)
        {
            label.Location = new Point(s_x, s_y);
            label.Width = e_x - s_x;
            label.Height = e_y - s_y;
        }
        else if(s_x > e_x && s_y > e_y)
        {
            label.Location = new Point(e_x, e_y);
            label.Width = s_x - e_x;
            label.Height = s_y - e_y;
        }
        
        Random rand = new Random();
        label.BackColor = Color.FromArgb(rand.Next(255), rand.Next(255), rand.Next(255));

        return label;
    }

    private void Form4_MouseDown(object sender, MouseEventArgs e)
    {
        start_x = e.X;
        start_y = e.Y;
        label = CreateLabel(start_x, start_y, start_x, start_y);
        draw = true;
        this.Controls.Add(label);
    }

    private void Form4_MouseMove(object sender, MouseEventArgs e)
    {
        if (draw)
        {
            // calculate new location and size
            int new_start_x=start_x, new_start_y=start_y;
            int width, height;
            end_x = e.X;
            end_y = e.Y;
            if (end_x < start_x)
            {
                new_start_x = end_x;
            }
            if (end_y < start_y)
            {
                new_start_y = end_y;
            }
            
            width = Math.Abs(start_x - end_x);
            height = Math.Abs(start_y - end_y);
            
            start_x = new_start_x;
            start_y = new_start_y;

            // draw resized label
            label.Location = new Point(start_x, start_y);
            label.Width = width;
            label.Height = height;
        }
    }

    private void Form4_MouseUp(object sender, MouseEventArgs e)
    {
       draw = false;
    }
}