powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Изменить размер нарисованной фигуры передвижением мышки
7 сообщений из 7, страница 1 из 1
Изменить размер нарисованной фигуры передвижением мышки
    #39446953
Фотография mraklbrw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер.

Есть задание: реализовать изменение нарисованной фигуры на форме движением мыши.
Фигуры-окружности.

Код
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows;
using System.Windows.Input;
using System.Threading;
using System.Runtime.InteropServices;


namespace Grafa
{
public partial class Form1 : Form
{
bool is_press = false;
int cur_counter = 0;
int counter = 0;
Ellipsoid[] mas = new Ellipsoid[100];

Graphics grafa_1;
Pen pen_1 = new Pen(Color.Black);
public Form1()
{
InitializeComponent();
grafa_1 = Graphics.FromHwnd(pictureBox1.Handle);
for (int i = 0; i < 100; i++)
{
mas[i] = new Ellipsoid(5555, 5555);
}
}

private void button1_Click(object sender, EventArgs e)
{
counter++;
int pic_width = pictureBox1.Width / 2;
int pic_height = pictureBox1.Height / 2;
Random random_1 = new Random();
int rand_width = random_1.Next(0, pic_width);
int rand_height = random_1.Next(0, pic_height);
mas[counter] = new Ellipsoid(rand_width, rand_height);
grafa_1.DrawEllipse(pen_1, rand_width, rand_height, 100, 100);
}

private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
pen_1.Width = 1;
}

private void toolStripMenuItem3_Click(object sender, EventArgs e)
{
pen_1.Width = 5;
}

private void toolStripMenuItem4_Click(object sender, EventArgs e)
{
pen_1.Width = 10;
}

private void сплошнаяToolStripMenuItem_Click(object sender, EventArgs e)
{
pen_1.DashPattern = new float[] {1f};
}

private void пунктирнаяToolStripMenuItem_Click(object sender, EventArgs e)
{
pen_1.DashPattern = new float[] { 2f, 1f };
}

private void цветФигурыToolStripMenuItem_Click(object sender, EventArgs e)
{
if (colorDialog1.ShowDialog() == DialogResult.OK)
{
pen_1.Color = colorDialog1.Color;
}
}

public bool Is_Detect(MouseEventArgs e)
{
// Детектирование, кликнули ли мы по какой-нибудь окружности
for (int i = 0; i < 10000; i++)
{
if ((mas[i].width_ <= e.X) && (e.X <= (mas[i].width_) + 100) && (mas[i].height_ <= e.Y) && (e.Y <= (mas[i].height_ + 100)))
{
return true;
}
}
return false;
}

public int GetEllipsoidIndex(MouseEventArgs e)
{
// Определение индекса выделенной окружности
for (int i = 0; i < 100; i++)
{
if ((mas[i].width_ <= e.X) && (e.X <= (mas[i].width_) + 100) && (mas[i].height_ <= e.Y) && (e.Y <= (mas[i].height_ + 100)))
{
return i;
}
}
return -1;
}

private void Form1_Load(object sender, EventArgs e)
{

}

[DllImport("user32.dll")]
public static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey);

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
// Мышка зажата
// Детектирование, кликнули ли мы по какой-нибудь окружности
is_press = true;

if (Is_Detect(e))
{
int n = GetEllipsoidIndex(e);

int p_x = e.X;
int p_y = e.Y;
int p_x_new;
int p_y_new;
while(is_press == true)
{
Int16 state = GetAsyncKeyState(Keys.LButton);
if ((state & 0x8000) == 0)
is_press = false;

p_x_new = Cursor.Position.X;
p_y_new = Cursor.Position.Y;


double ratio = p_x_new / p_x;

int he = Convert.ToInt32(100 * ratio);
int we = Convert.ToInt32(100 * ratio);

grafa_1.Clear(Color.White);

for (int i = 0; i < 100; i++)
{
if ((mas[i].width_ != 5555) && (mas[i].height_ != 5555))
{
if (i == n)
{
grafa_1.DrawEllipse(pen_1, mas[i].width_, mas[i].height_, we, he);
}
else
grafa_1.DrawEllipse(pen_1, mas[i].width_, mas[i].height_, 100, 100);
}
}

System.Threading.Thread.Sleep(50);
}
}
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
// Мышка отпущена

is_press = false;

//MessageBox.Show("false");
}
}


public class Ellipsoid
{
public int width_;
public int height_;
public Ellipsoid(int r_width, int r_height) { width_ = r_width; height_ = r_height; } // Конструктор
}
}


Ссылка на проект
https://yadi.sk/d/EqpLDIMw3HWz7R


Проблема с изменением размера окружности и дальнейшей перерисовкой всех окружностей.
Т.е. при следующем изменении размера другой окружности старая окружность возвращается в свои исходные размеры.
...
Рейтинг: 0 / 0
Изменить размер нарисованной фигуры передвижением мышки
    #39446958
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Изменить размер нарисованной фигуры передвижением мышки
    #39447010
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mraklbrwТ.е. при следующем изменении размера другой окружности старая окружность возвращается в свои исходные размеры.

А ты разве запоминаешь где-то измененные размеры?

Перерисовывать в mouseDown - порочная практика. В mouseDown нужно найти нужный эллипс и изменить его размеры, и вызвать перерисовку холста
...
Рейтинг: 0 / 0
Изменить размер нарисованной фигуры передвижением мышки
    #39447419
Фотография mraklbrw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переписал код с использованием List<Ellipsoid>.

Иногда вываливается с ошибкой Overflow. Странно, в коде нигде не нашёл возможной ошибке.

И так же осталась ещё одна проблема:
окружность сначала вообще не меняют размер, а если продолжить тащить, то резко увеличиваются в размерах и пропадают за пределами pictureBox.
Код
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows;
using System.Windows.Input;
using System.Threading;
using System.Runtime.InteropServices;


namespace Grafa
{
    public partial class Form1 : Form
    {
        bool is_press = false;
        List<Ellipsoid> el = new List<Ellipsoid>();
           
        Graphics grafa_1;
        Pen pen_1 = new Pen(Color.Black);
        public Form1()
        {
            InitializeComponent();
            grafa_1 = Graphics.FromHwnd(pictureBox1.Handle);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int pic_width = pictureBox1.Width / 2;
            int pic_height = pictureBox1.Height / 2;
            Random random_1 = new Random();
            int rand_width = random_1.Next(0, pic_width);
            int rand_height = random_1.Next(0, pic_height);
            el.Add(new Ellipsoid(rand_width, rand_height, 100, 100));
            grafa_1.DrawEllipse(pen_1, rand_width, rand_height, 100, 100);
        }

        private void toolStripMenuItem2_Click(object sender, EventArgs e)
        {
            pen_1.Width = 1;
        }

        private void toolStripMenuItem3_Click(object sender, EventArgs e)
        {
            pen_1.Width = 5;
        }

        private void toolStripMenuItem4_Click(object sender, EventArgs e)
        {
            pen_1.Width = 10;
        }

        private void сплошнаяToolStripMenuItem_Click(object sender, EventArgs e)
        {
            pen_1.DashPattern = new float[] {1f};
        }

        private void пунктирнаяToolStripMenuItem_Click(object sender, EventArgs e)
        {
            pen_1.DashPattern = new float[] { 2f, 1f };
        }

        private void цветФигурыToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                pen_1.Color = colorDialog1.Color;
            }
        }

        public bool Is_Detect(MouseEventArgs e)
        {
            // Детектирование, кликнули ли мы по какой-нибудь окружности
            for (int i = 0; i < el.Count; i++)
            {
                if ((el[i].width_ <= e.X) && (e.X <= (el[i].width_) + 100) && (el[i].height_ <= e.Y) && (e.Y <= (el[i].height_ + 100)))
                {
                    return true;
                }
            }
            return false;
        }

        public int GetEllipsoidIndex(MouseEventArgs e)
        {
            // Определение индекса выделенной окружности
            for (int i = 0; i <  el.Count; i++)
            {
                if ((el[i].width_ <= e.X) && (e.X <= (el[i].width_) + 100) && (el[i].height_ <= e.Y) && (e.Y <= (el[i].height_ + 100)))
                {
                    return i;
                }
            }
            return -1;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        [DllImport("user32.dll")]
        public static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey);

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            // Мышка зажата
            // Детектирование, кликнули ли мы по какой-нибудь окружности
            is_press = true;

            if (Is_Detect(e))
            {
                int n = GetEllipsoidIndex(e);

                int p_x = e.X;
                int p_y = e.Y;
                int p_x_new;
                int p_y_new;
                while(is_press == true)
                {
                    Int16 state = GetAsyncKeyState(Keys.LButton);
                    if ((state & 0x8000) == 0)
                        is_press = false;

                    p_x_new = Cursor.Position.X;
                    p_y_new = Cursor.Position.Y;

                    
                        double ratio = p_x_new / p_x;
                        
                        int he = Convert.ToInt32(el[n].he * ratio);
                        int we = Convert.ToInt32(el[n].wi * ratio);

                    el[n].wi = we;
                    el[n].he = he;

                        grafa_1.Clear(Color.White);

                        for (int i = 0; i < el.Count; i++)
                        {
                                   grafa_1.DrawEllipse(pen_1, el[i].width_, el[i].height_, Convert.ToInt32(el[i].wi), Convert.ToInt32(el[i].he));
                        }

                    System.Threading.Thread.Sleep(50);
                }
            }
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            // Мышка отпущена

            is_press = false;

            //MessageBox.Show("false");
        }
    }


    public class Ellipsoid
    {
        public int width_;
        public int height_;
        public double wi;
        public double he;
        public Ellipsoid(int r_width, int r_height, double wi, double he)
        {
            width_ = r_width;
            height_ = r_height;
            this.wi = wi;
            this.he = he;
        }
    }
}




проект целиком
https://yadi.sk/d/EqpLDIMw3HWz7R


Pallaris,
но ведь мы должны перерисовывать всё время, пока мышка не отпущена.
...
Рейтинг: 0 / 0
Изменить размер нарисованной фигуры передвижением мышки
    #39447447
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mraklbrwно ведь мы должны перерисовывать всё время, пока мышка не отпущена.

А не должны ли мы перерисовать, когда изменился размер окна, его перетащили, свернули развернули?
...
Рейтинг: 0 / 0
Изменить размер нарисованной фигуры передвижением мышки
    #39447457
Фотография mraklbrw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, размер pictureBox и формы фиксированный.
...
Рейтинг: 0 / 0
Изменить размер нарисованной фигуры передвижением мышки
    #39447508
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам же подсказали как делать. Создали список фигур, в методе прорисовки холста пробегаетесь по списку и прорисовываете фигуры. В событиях, связанных с мышкой, вы только меняете размеры и если надо, координаты фигуры, на которую кликнули. Там же вызываете прорисовку холста.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Изменить размер нарисованной фигуры передвижением мышки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]