Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создание многооконного интерфейса на С#.Net

17K
19 октября 2006 года
Dionis
23 / / 29.08.2006
В общем, такая проблемка при создании многооконного интерфейса:
Родительское MDI окно. Внутри родительского MDI окна есть открытые дочерние MDI окна, которые могут передвигаться только в пределах родительского окна (аналог открытые документы в Word)
Также есть дочернее не MDI окно, которое может передвигаться по всему экрану, а не только в пределах области родительского окна (аналог диалог "Найти и заменить" в Word)

В родительском MDI окне есть строка меню.

Два вопроса:
1. Когда активно дочернее MDI окно, то щелчок, например, на строке меню родительского окна приводит к переходу фокуса на родительское окно и реакцию меню на этот щелчок.
Когда активно дочернее не MDI окно, то аналогичный щелчок приводит ТОЛЬКО к переходу фокуса, а чтобы меню прореагировало, то надо щелкнуть еще раз. А в Worde реакция меню немедленная. Как сделать также?
Пробовал искать в MSDN - ответа конкретно на этот вопрос не нашел.

2. Дочернее не MDI окно открывается при клике на кнопке на строке меню. У этой кнопки свойство CheckOnClick установлено в true. Соответственно в событии стоит:
Код:
public partial class Form1 : Form
{
     MdiChild Child1 = new MdiChild(); // это дочернее MDI окно
     MdiChild ChildInfo = new MdiChild(); // это дочернее не MDI окно
 
     // это конструктор
     public Form1()
     {
          InitializeComponent();
          Child1.MdiParent = this; // устанавливаем родителя для MDI окна
          Child1.Show(); // показывам MDI окно
          ChildInfo.Owner = this; // устанавливаем родителя для не MDI окна
     }
 
     // щелчок на кнопке на строке меню
     private void toolStripButton1_Click(object sender, EventArgs e)
     {
           if (toolStripButton1.Checked)
                ChildInfo.Show(); // показать дочернее не MDI окно
           else
                ChildInfo.Hide(); // скрыть дочернее не MDI окно
     }
}

НО! Если закрыть это дочернее окно крестом (или F4), то потом при щелчке на кнопке меню для отображения дочернего не MDI окна выдается ошибка при вызове метода ChildInfo.Show()
Доступ к ликвидированному объекту невозможен.
Имя объекта: "MdiChild".
Я обхожу это тем, что обрабатываю это исключение и если объект ликвидирован, то делаю снова ChildInfo = new MdiChild();
Но мне кажется это немного коряво.
Может есть другой путь? И если решится первый вопрос, то второй отпадет сам собой?
273
19 октября 2006 года
3A3-968M
1.2K / / 22.12.2005
Что касается второго вопроса - щелчёк на кресте или через Alt-F4 вызывает метод Close, который вызывеает Dispose. Также возникает событие FormClosed, в котором можно обработать все случаи закрытия окна: окно закрыто приложением, пользователем, нажатием Alt+F4 или менеджером задач. Для скрытия окна вызывай Hide. Можно вовсе запретить уничтожение окна пользователем при нажатии крестика (всё через тоже событие), а программно разрешить. Для решения первой проблемы можно использовать события форм Activate и Deactivate для контроля перехода фокуса.
17K
19 октября 2006 года
Dionis
23 / / 29.08.2006
[QUOTE=3A3-968M]Что касается второго вопроса - щелчёк на кресте или через Alt-F4 вызывает метод Close, который вызывеает Dispose. Также возникает событие FormClosed, в котором можно обработать все случаи закрытия окна: окно закрыто приложением, пользователем, нажатием Alt+F4 или менеджером задач. Для скрытия окна вызывай Hide. Можно вовсе запретить уничтожение окна пользователем при нажатии крестика (всё через тоже событие), а программно разрешить. Для решения первой проблемы можно использовать события форм Activate и Deactivate для контроля перехода фокуса.[/QUOTE]

А как запретить уничтожение окна пользователем через событие? Я пробовал ставить в событие FormClosed обычный return, форма все равно закрывается....
Насчет Activate Deactivate дальше направление мысли не подскажете?
Надо как то вызвать событие MouseClick в событии Activate ?
303
20 октября 2006 года
makbeth
1.0K / / 25.11.2004
Насчет отмены: использовать надо не FormClosed, а FormClosing, а дальше все просто:
 
Код:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = true;            
}
17K
20 октября 2006 года
Dionis
23 / / 29.08.2006
[QUOTE=makbeth]Насчет отмены: использовать надо не FormClosed, а FormClosing, а дальше все просто:
 
Код:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = true;            
}
[/QUOTE]

Классно! Спасибо! Заработало!
Теперича можно один раз сделать new, а потом только делать show() и hide()!
38K
27 марта 2008 года
Situ
1 / / 27.03.2008
все равно умерает от алт+ф4 подскажите как сделать что бы не закрывалось окно)
у меня тупо не паподает в Form1_FormClosing... как зделать что бы при нажатие на крест обрабатовалось это событие?)
17K
29 марта 2008 года
Dionis
23 / / 29.08.2006
Подписываемся:

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);

и обрабатываем:


private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
this.Hide();
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог