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 окно
}
}
Создание многооконного интерфейса на С#.Net
Родительское MDI окно. Внутри родительского MDI окна есть открытые дочерние MDI окна, которые могут передвигаться только в пределах родительского окна (аналог открытые документы в Word)
Также есть дочернее не MDI окно, которое может передвигаться по всему экрану, а не только в пределах области родительского окна (аналог диалог "Найти и заменить" в Word)
В родительском MDI окне есть строка меню.
Два вопроса:
1. Когда активно дочернее MDI окно, то щелчок, например, на строке меню родительского окна приводит к переходу фокуса на родительское окно и реакцию меню на этот щелчок.
Когда активно дочернее не MDI окно, то аналогичный щелчок приводит ТОЛЬКО к переходу фокуса, а чтобы меню прореагировало, то надо щелкнуть еще раз. А в Worde реакция меню немедленная. Как сделать также?
Пробовал искать в MSDN - ответа конкретно на этот вопрос не нашел.
2. Дочернее не MDI окно открывается при клике на кнопке на строке меню. У этой кнопки свойство CheckOnClick установлено в true. Соответственно в событии стоит:
Код:
НО! Если закрыть это дочернее окно крестом (или F4), то потом при щелчке на кнопке меню для отображения дочернего не MDI окна выдается ошибка при вызове метода ChildInfo.Show()
Доступ к ликвидированному объекту невозможен.
Имя объекта: "MdiChild".
Я обхожу это тем, что обрабатываю это исключение и если объект ликвидирован, то делаю снова ChildInfo = new MdiChild();
Но мне кажется это немного коряво.
Может есть другой путь? И если решится первый вопрос, то второй отпадет сам собой?
Что касается второго вопроса - щелчёк на кресте или через Alt-F4 вызывает метод Close, который вызывеает Dispose. Также возникает событие FormClosed, в котором можно обработать все случаи закрытия окна: окно закрыто приложением, пользователем, нажатием Alt+F4 или менеджером задач. Для скрытия окна вызывай Hide. Можно вовсе запретить уничтожение окна пользователем при нажатии крестика (всё через тоже событие), а программно разрешить. Для решения первой проблемы можно использовать события форм Activate и Deactivate для контроля перехода фокуса.
А как запретить уничтожение окна пользователем через событие? Я пробовал ставить в событие FormClosed обычный return, форма все равно закрывается....
Насчет Activate Deactivate дальше направление мысли не подскажете?
Надо как то вызвать событие MouseClick в событии Activate ?
Код:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
}
{
e.Cancel = true;
}
Код:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
}
{
e.Cancel = true;
}
Классно! Спасибо! Заработало!
Теперича можно один раз сделать new, а потом только делать show() и hide()!
у меня тупо не паподает в Form1_FormClosing... как зделать что бы при нажатие на крест обрабатовалось это событие?)
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
и обрабатываем:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
this.Hide();
}