Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
9 / 8 / 2
Регистрация: 23.04.2014
Сообщений: 83
1

Как расположить кнопки, чтобы они не накладывались друг на друга?

09.10.2014, 17:33. Просмотров 4509. Ответов 12
Метки нет (Все метки)


Помогите найти ошибку. Пишу программу, которая динамически порождает кнопки. Не могу дописать условие, чтобы они не накладывались и проверялись координаты.
Кликните здесь для просмотра всего текста
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
 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        Random d = new Random();
 
        private void button1_Click(object sender, EventArgs e)
        {
            int x2 = 0;
            int y2 = 0;
            int w = 40;
            int h = 40;
 
            bool flag1 = true;
            while (flag1)
            {
                x2 = d.Next(51, 150);
                y2 = d.Next(51, 150);
                foreach (Control c in this.Controls)
                    if ((x2 > c.Location.X) && (y2 > c.Location.Y) && (x2 < c.Location.X + c.Width) && (y2 < c.Location.Y + c.Height &&
                                         (x2+w > c.Location.X ) && (y2 + h < c.Location.Y))) //&& (x2 + w < c.Location.X + c.Width) && (y2 + h < c.Location.Y + c.Height))
                    { flag1 = false; break; }
                if (flag1) break;
                else flag1 = true;
            }
            Button a = new Button();
            a.Parent = this;
            a.Location = new Point(x2, y2);
            a.Size = new Size(w, h);
        }
    }
}

Я уже все варианты перебрала. Подскажите в чем ошибка. Пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2014, 17:33
Ответы с готовыми решениями:

Как сделать, чтобы картинка и текст в Label не накладывались друг на друга
Добрый день! У меня есть label, включил для него иконку. Нужно, чтобы иконка показывалась слева...

Как отображать сообщения в форуме так, чтобы они не накладывались друг на друга?
Делаю форум, и сталкнулся с такой проблемой. Как отображать сообщения так что бы они не...

Сделать, чтобы элементы Canvas не накладывались друг на друга
Доброго времени суток, хотел узнать если у Canvas какой нибудь параметр который , обрезает дочернии...

Правильно расставить вызовы подпрограммы, чтобы результаты вычислений в файле не накладывались друг на друга
Помогите пожалуйста Мне в этой программе нужно правильно расставить подпрограмму subroutine чтобы...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы С#-разработчиков‌
12
6020 / 3427 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
09.10.2014, 17:53 2
а зачем какие-то проверки? просто при создании кнопок необходимо циклически менять координаты на нужные величины.
0
Администратор
Эксперт .NET
9051 / 4326 / 744
Регистрация: 17.04.2012
Сообщений: 9,099
Записей в блоге: 14
09.10.2014, 17:56 3
Цитата Сообщение от nio Посмотреть сообщение
необходимо циклически менять координаты на нужные величины
deathly_hallows, хотите выстроить в столбик, увеличивайте X, в строку - Y
0
9 / 8 / 2
Регистрация: 23.04.2014
Сообщений: 83
09.10.2014, 18:02  [ТС] 4
tezaurismosis, Если бы было все так просто...
"Разработать программу, динамически порождающую на окне кнопки и поля ввода. Координаты элемента управления определяется случайным образом. Элементы управления не должны накладываться друг на друга. Если нет возможности добавить элемент управления (нет места для размещения элемента), то предусмотреть вывод информации об этом."
Как я думаю, что нужно проверять координаты каждого угла, чтобы они не накладывались друг на друга.
Но дальше возникает вопрос: Как?
0
Администратор
Эксперт .NET
9051 / 4326 / 744
Регистрация: 17.04.2012
Сообщений: 9,099
Записей в блоге: 14
09.10.2014, 18:40 5
deathly_hallows, вопрос понял, сейчас попытаюсь накидать код...

Добавлено через 32 минуты
Ну теперь прошу помощь сообщества
Полагаю, каркас кода должен быть таким, но видимо, условие и мной выбрано неверно
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
namespace WindowsFormsApplication
{
    public partial class MainForm : Form
    {
        public MainForm() {
            InitializeComponent();
        }
 
        private void DropNextControl() {
            Random randGen = new Random();
            Control ctrl;
            if (randGen.Next(0, 11) > 5)
                ctrl = new Button { Text = "Button" };
            else
                ctrl = new Label { Text = "Label" };
            int x = randGen.Next(0, this.Size.Width);
            int y = randGen.Next(0, this.Size.Height);
 
            bool isIntersect = true;  // текущий контрол перекрывает другой
            foreach (Control c in this.Controls) {
                int deepnessCounter = 100; // максимальное количество проверок
                while (deepnessCounter > 0) {
                    if ((x > c.Location.X && x < c.Location.X + ctrl.Width) &&
                        (y > c.Location.Y && y < c.Location.Y + ctrl.Height)) {
                        x = randGen.Next(0, this.Size.Width);
                        y = randGen.Next(0, this.Size.Height);
                        isIntersect = true;
                    }
                    else {
                        isIntersect = false;
                    }
                    deepnessCounter--;
                }
                if (!isIntersect)
                    ctrl.Location = new Point(x, y);
            } 
            this.Controls.Add(ctrl);
        }
 
        private void button1_Click(object sender, EventArgs e) {
            DropNextControl();
        }
    }
}
0
9 / 8 / 2
Регистрация: 23.04.2014
Сообщений: 83
09.10.2014, 18:46  [ТС] 6
tezaurismosis, Спасибо.
Надеюсь, кто-нибудь еще заглянет на помощь.)
0
Заблокирован
10.10.2014, 00:56 7
deathly_hallows, какие входные параметры? (количество кнопок, есть ли базовый строгий размер и т.д.)
0
111 / 82 / 32
Регистрация: 10.08.2014
Сообщений: 420
10.10.2014, 01:20 8
Добавлю только, что если вставить MessageBox(isIntersect.ToString()); и break; то условие вроде бы отрабатывает нормально, но контролы всё равно генерируются.
0
9 / 8 / 2
Регистрация: 23.04.2014
Сообщений: 83
10.10.2014, 04:17  [ТС] 9
Ev_Hyper, Нет никаких входных параметров. Просто одна кнопка на форме и при нажатии на нее она рандомно генерирует координаты другой кнопки на форме. Если кнопка появилась, другая кнопка не должна попасть никаким углом на появившуюся.
0
6020 / 3427 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
10.10.2014, 10:21 10
deathly_hallows, проблема надуманна. Всё можно сделать гораздо проще.
Делается TableLayoutPanel. В ней рандомно размещаются контролы. Как сделать рандом неповторяющихся значений, уже обсуждалось не раз. координаты не пересекутся никогда
0
9 / 8 / 2
Регистрация: 23.04.2014
Сообщений: 83
10.10.2014, 11:06  [ТС] 11
nio,Об этом не знала... Можно это представить в виде кода, пожалуйста
0
Администратор
Эксперт .NET
9051 / 4326 / 744
Регистрация: 17.04.2012
Сообщений: 9,099
Записей в блоге: 14
13.10.2014, 08:59 12
Опишем математическое выражение данной проблемы.
Даны имеющийся контрол c и новый контрол ctrl.
Пусть
c.Location.X = xc
c.Location.Y = yc
c.Width = wc
c.Height = hc

ctrl.Location.X = x
ctrl.Location.Y = y
ctrl.Width = w
ctrl.Height = h
Тогда два эти контрола не будут иметь пересечения в случае одновременного сочетания двух данных условий
1) https://www.cyberforum.ru/cgi-bin/latex.cgi?{\{{x}_{c}; {x}_{c} + {w}_{c}\}} \cap {\{x; x + w\}} \neq \emptyset
2) https://www.cyberforum.ru/cgi-bin/latex.cgi?{\{{y}_{c}; {y}_{c} + {h}_{c}\}} \cap {\{y; y + h\}} \neq \emptyset
Тогда получается такой код:
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
using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
 
namespace WindowsFormsApplication
{
    public partial class MainForm : Form
    {
        private Random randGen;
 
        public MainForm() {
            InitializeComponent();
            randGen = new Random();
        }
 
        private bool IsHaveCollisions(Control ctrl, int x, int y) {
            foreach (Control c in this.Controls) {
                if ((Enumerable.Range(c.Location.X, c.Width)
                      .Intersect(Enumerable.Range(x, ctrl.Width)).Count() != 0) &&
                    (Enumerable.Range(c.Location.Y, c.Height)
                      .Intersect(Enumerable.Range(y, ctrl.Height)).Count() != 0))
                {
                        return true;
                }
            }
            return false;
        }
 
        private void DropNextControl() {
            Control ctrl;
            if (randGen.Next(0, 11) > 5)
                ctrl = new Button { Text = "Button" };
            else
                ctrl = new Label { Text = "Label", AutoSize = true };
            int x = randGen.Next(0, this.Size.Width - ctrl.Width);
            int y = randGen.Next(0, this.Size.Height - ctrl.Height);
 
            int displacmentTries = 1000;  // количество проверок
            while (IsHaveCollisions(ctrl, x, y) && --displacmentTries > 0) {
                x = randGen.Next(0, this.Size.Width - ctrl.Width);
                y = randGen.Next(0, this.Size.Height - ctrl.Height);
            }
 
            if (displacmentTries == 0) {
                MessageBox.Show("Больше нет места.");
                return;
            }
 
            ctrl.Location = new Point(x, y);
            this.Controls.Add(ctrl);
            this.Text = "Количество попыток: " +
                (1001 - displacmentTries).ToString();
        }
 
        private void button1_Click(object sender, EventArgs e) {
            DropNextControl();
        }
    }
}
Пересечений не видел
0
6020 / 3427 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
20.10.2014, 13:27 13
deathly_hallows, давно не заходил, не знаю актуально ли, но инфа тут http://msdn.microsoft.com/ru-r... s.90).aspx
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.10.2014, 13:27

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Как сделать так чтобы при спавне предметов они отталкивались друг от друга если они спавнятся близко С#
Есть загвоздка, не как не могу понять как это релизовать, приведу пример : происходит спавн кубов...

Как выводить в Txt файл значения так, чтобы они не заменяли друг друга
Вот такая вот программа. На строчках 46-49 она должна записывать значения в файл. Можно ли...

Как соединить два канал интернета чтобы они видели друг друга?(Компьютеров)
У меня на предприятии есть 2 белые IP интернета, на один из них установлено все наше локалные сеть...

Как в PHP отделить элементы друг от друга, чтобы не ругались друг на друга?
&lt;?php $chitat = fopen('yoo.txt', 'r'); if (!$chitat) { echo 'Ошибка при открытии файла...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.