Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Если контрон перекрыт другим контролом ? Можно это как-то поределить !? 
:(
    Опции темы
StepS
  Дата 14.12.2005, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 26.8.2005
Где: Днепропетровск

Репутация: нет
Всего: нет



Собственно сабж !
Например TextBox перекрыт Panel как мне определить накрыть он Panel или нет ?
PM MAIL ICQ   Вверх
mr.DUDA
Дата 14.12.2005, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Проходим по коллекции Controls, смотрим у какого контрола прямоугольная область совпадает или пересекает нашу. Если нашли - проверяем с пом. метода ContolCollection.GetChildIndex, какой из контролов выводится последним (чем меньше число возвращаемое GetChildIndex, тем "выше" контрол). Если последним выводится наш контрол - значит всё нормально, т.к. он перекроет другой контрол. Иначе - наш контрол закрыт чужим контролом.

Код
    public class Form1 : System.Windows.Forms.Form
    {
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad (e);

            // проверяемый контрол
            Control control = this.textBox1;

            // здесь будет контрол, пересекающий наш control
            Control result = null;

            // проверяем дочерние контролы формы
            foreach(Control c in this.Controls)
            {
                Rectangle r1 = new Rectangle(c.Location, c.Size);
                Rectangle r2 = new Rectangle(control.Location, control.Size);
                if(r1.IntersectsWith(r2))
                {
                    if(this.Controls.GetChildIndex(c) < this.Controls.GetChildIndex(control))
                        result = c;
                }
            }

            if(result != null)
                MessageBox.Show("контрол " + control.Name + " перекрыт контролом: " + result.Name);
        }



--------------------
user posted image
PM MAIL WWW   Вверх
StepS
Дата 15.12.2005, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 26.8.2005
Где: Днепропетровск

Репутация: нет
Всего: нет



только что попробовал - не работает! фишка вот в чем:
я сначала вывожу на форму textbox, потом поверх его вывожу panel с разными контролами. ТЕперь над panel есть кнопочка "Hide", нажимая ее у меня исчезает Panel со всеми контролами и на форме остается только textbox. Так вот в не зависимости от того скрыт ли сейчас panel у него всегда GetchildIndex - 1, а у textbox - 2. Т.е. предложенным методом я не могу определить в данный, конкретный момент у меня textbox видит пользователь или нет! не хотелось бы по нажатию на кнопку "hide" перебирать все контролы и контролы которые перекрыты ставить атрибут Visible=false. Если без этого не обойтись, то навреное придется так и сделать ! я думал у Framework есть какие-нить средства для этого !
PM MAIL ICQ   Вверх
mr.DUDA
Дата 15.12.2005, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(StepS @ 15.12.2005, 09:39)
ТЕперь над panel есть кнопочка "Hide", нажимая ее у меня исчезает Panel со всеми контролами и на форме остается только textbox. Так вот в не зависимости от того скрыт ли сейчас panel у него всегда GetchildIndex - 1, а у textbox - 2.

Если контролы ещё и можно скрывать/показывать, то конечно нужна проверка на visible. Строку

if(this.Controls.GetChildIndex(с ) < this.Controls.GetChildIndex(control))

надо заменить на

if(c.Visible && this.Controls.GetChildIndex(с ) < this.Controls.GetChildIndex(control))

Вот и всё.


--------------------
user posted image
PM MAIL WWW   Вверх
StepS
Дата 15.12.2005, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 26.8.2005
Где: Днепропетровск

Репутация: нет
Всего: нет



тоже вариант ! smile спасибо, попробую. Но все равно, мы проходим по всей коллекции контролов на форме smile . Интересно не повлияет ли заметно это на скорость работы формы ? как думаешь ? или это так малозаметно что не стоит заморачиваться над этим ?
PM MAIL ICQ   Вверх
mr.DUDA
Дата 15.12.2005, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(StepS @ 15.12.2005, 12:18)
Интересно не повлияет ли заметно это на скорость работы формы ?

Если делать эту проверку только при загрузке формы и изменении видимости панели, то вообще не повлияет.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.