Создание многооконного windows приложения

Создание многооконных приложений в Visual Studio .Net

Все приложения Windows делятся на два вида – однооконные (SDI – Single Document Interface) и многооконные (MDI – Multi Document Interface). SDI-приложения имеют одну или несколько форм, которые выводятся на экран независимо друг от друга. Примерами SDI-приложений являются такие программы, как калькулятор и Paint. MDI-приложения имеют главную форму (называемую родительской, или Parent Form), внутри которой отображаются подчиненные формы (называемые дочерними, или Child Forms). Каждый документ открывается в своем дочернем окне. Примерами многооконных приложений являются приложения Word и Excel. Сама система Visual Studio .Net также является многооконным приложением. В MDI-приложениях при закрытии главной формы автоматически закрываются все ее дочерние формы. Диалоговые окна не влияют на работу ни SDI-приложений, ни MDI-приложений, они в любом случае отображаются поверх всех форм.

Создание SDI-приложения не требует дополнительных усилий. По-умолчанию любое приложение, создаваемое с помощью среды разработки Visual Studio .Net, является SDI-приложением. Для создания же MDI-приложения требуется установить определенные свойства некоторым формам и написать соответствующий код. При этом, если все дочерние формы однотипны, то в проект достаточно добавить только одну дочернюю форму, т.к. на экране в процессе выполнения программы отображается наследный экземпляр дочерней формы. Поэтому даже при наличии одной дочерней формы внутри главной формы можно отобразить сколько угодно ее экземпляров. Если же дочерние формы различны, то в проект можно добавить только по одной дочерней форме каждого вида.

Для создания MDI-приложения необходимо в той форме, которая является главной, установить значение свойства IsMDIContainer, равное True (по умолчанию устанавливается значение False). У дочерних форм никаких специальных свойств устанавливать не требуется.

Для загрузки экземпляра дочерней формы необходимо написать следующий код (Form2 – имя дочерней формы):

Visual Basic .Net:

Dim newmdichild As New Form2

Visual C# .Net:

Form newmdichild = new Form2();

После загрузки дочерней формы ее можно обрабатывать как обычную. В частности, она имеет собственное событие Load, где можно, например, изменять ее заголовок:

Visual Basic .Net:

Me.Text = «Вторая дочернаяя форма»

Visual C# .Net:

this.Text = «Моя вторая форма»;

и записать другие действия. Для скрытия дочерней формы с экрана используются методы Hide и Close, также, как и для обычной формы, например:

Visual Basic .Net:

Visual C# .Net:

Ключевое слово Me (this) здесь относится к дочерней форме, т.к. в данный момент эта форма является текущей. Дочерние формы можно закрывать и обычным образом (через кнопку закрытия окна Windows).

Если же нужно закрыть дочернюю форму из главной (например, из соответствующего пункта меню), то значение методов Hide и Close меняется. Например, для закрытия текущей дочерней формы метод Close применяется к объекту ActiveMDIChild:

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

Visual Basic .Net:

Dim f As New Form

For Each f In Me.MdiChildren

Visual C# .Net:

foreach (Form f in this.MdiChildren)

Ключевое слово Me (this)здесь также относится к родительской форме.

Дочерние окна внутри родительской формы можно упорядочивать по вертикали, по горизонтали, каскадом или по значкам. Такая возможность имеется во многих программах (Word, Excel и др.). Для реализации этой возможности в Visual Basic .Net используют метод LayoutMDI родительской формы, например:

Visual Basic .Net:

Visual C# .Net:

Ключевое слово Me (this) здесь также относится к родительской форме.

Создание многооконного приложения

Цель работы: Изучить основные способы разработки многооконных приложений. Получить практические навыки в создании многооконных приложений.

Создание дочерней формы

Основа Интерфейса ( MDI ) приложения — MDI родительская форма. Это — форма, которая содержит MDI дочерние окна. Дочерние окна являются «подокнами», с которыми пользователь взаимодействует в MDI приложении. Создание MDI родительской формы описано в «Создание главного меню приложения» .

Для определения главного окна ( Form1 ), как родительской формы в окне Свойств, установите IsMDIContainer свойство — true . Это определяет форму как MDI контейнер для дочерних форм. Для того чтобы родительское окно занимало весь экран необходимо свойству WindowsState установить значение Maximized .

Читайте также:  Сообщество linux без systemd

Создайте еще одно окно, которое будет дочерним ( FormEmployee ). Для этого выберите пункт меню Project/Add Windows Form.

Это окно должно вызываться из пункта главного меню «Сотрудник». Вставьте код, подобный следующему, чтобы создать новую MDI дочернюю форму, когда пользователь щелкает на пункте меню , например «Сотрудник» — имя объекта — employeeToolStripMenuItem (В примере ниже, указатель события обращается к событию Click для employeeToolStripMenuItem_Click ).

Данный обработчик приведет к выводу на экран дочернего окна.

Создание меню в дочерней форме

Добавьте в дочернее окно пункт меню «Действие» ( actionToolStripMenuItem ) с подпунктами «Отменить» ( undoToolStripMenuItem ), «Создать» ( createToolStripMenuItem ), «Редактировать» ( editToolStripMenuItem ), «Сохранить» ( saveToolStripMenuItem ) и «Удалить» ( removeToolStripMenuItem ). Перед пунктом удалить вставьте разделитель ( Separator — name = toolStripSeparator1 ).

Добавьте в дочернее окно еще один пункт меню «Отчет» ( reportToolStripMenuItem ) c подпунктами » По сотруднику» ( reportToolStripMenuItem1 ), » По всем сотрудникам» ( reportToolStripMenuItem2 ). Дочернее окно будет иметь вид, представленный на рисунке 3.1

В главном меню родительской формы ( Form1 ) имеются пункты » Объект «, «Справочник» и «Справка». В дочерней форме ( FormEmployee ) сформированы пункты меню «Действие» и «Отчет». При загрузке дочерней формы меню родительской и дочерних форм должны были объединены и составлять следующую последовательность: » Объект «, «Действие», «Отчет», «Справочник» и «Справка». Объединение пунктов меню производится с помощью задания значений свойств MergeAction и MergeIndex для объектов ToolStripMenuItem .

Проверьте, чтобы в меню главного окна для объекта objectToolStripMenuItem свойство MergeAction было установлено Append , а MergeIndex было равно 0, а для объектов dictionaryToolStripMenuItem и helpToolStripMenuItem — соответственно 1 и 2. С учетом этого, в окне «Сотрудник» для объектов actionToolStripMenuItem (Действие) и «Отчет» ( reportToolStripMenuItem ) свойству MergeAction необходимо задать значение Insert , а свойству MergeIndex задаем порядковый номер который определяет позицию данного пункта меню обновленном главном меню , т.е. 1 (после объекта objectToolStripMenuItem ).

После компиляции программы, запуска ее на выполнение и вызова пункта меню «Сотрудник» экран должен иметь вид, представленный на рисунке 3.2.

Создание обработчиков для меню дочерней формы

Созданные пункты меню для дочернего окна должны инициировать выполнение соответствующих функций (Отменить, Создать, Редактировать, Сохранить и Удалить) приложения в отношении объектов конкретного дочернего окна. Для дочернего окна «Данные по сотруднику» эти функции должны выполнять соответственно отмену редактирования данных по сотруднику ( функция «Отменить»), создавать новые данные по сотруднику ( функция «Создать»), редактировать данные по сотруднику ( функция «Редактировать»), сохранять созданные вновь или отредактированные функция по сотруднику ( функция «Сохранить») и удалять данные по сотруднику ( функция «Удалить»).

Описанную функциональность целесообразно реализовать в программе в виде методов класса созданного FormEmployee . В приложении необходимо создать следующие методы:

  • Undo — отменить;
  • New — создать;
  • Edit — редактировать;
  • Save — сохранить;
  • Remove — удалить.

На начальных этапах проектирования, как правило, неясна реализация каждого метода, поэтому целесообразно их выполнять в виде методов-заглушек, которые только сообщают пользователю о своем вызове, а в дальнейшем необходимо написать реальный код.

Для создания метода Undo в коде файла FormEmployee.cs добавьте следующий метод:

Далее создаем обработчик события вызова пункта меню «Отменить». Для этого в дизайнере формы класса FormEmployee делаем двойной щелчок на пункте меню «Отменить». Инструментальная среда VS сгенерирует следующий код:

В код обработчика undoToolStripMenuItem_Click добавим вызов метода Undo :

Откомпилируем приложение и протестируем вызов метода Undo . В результате выбора пункта меню «Отменить» должно быть выведено диалоговое окно с сообщением, приведенным на рисунке 3.3.

Аналогичным образом создайте методы-заглушки для функций «Создать», «Редактировать», «Сохранить» и «Удалить».

Создаём MDI приложение с помощью Windows Forms

MDI приложения позволяют отображать несколько дочерних окон внутри одного главного окна. Что даёт возможно более рационально использовать пространство на экране и в ряде случаев повышает удобство работы с многооконным приложением.

Существует два основных подхода к реализации многооконных приложений:

  • Простое приложение.
    Каждое дочернее окно отображается отдельно.
  • MultipleDocumentInterface(MDI).
    Дочерние окна отображаются внутри одного «главного» окна.
Читайте также:  Установка орион про windows 10

Не редко оба подхода комбинируются. Например, небольшие вспомогательные диалоги отображаются отдельно, а окна содержащие основной функционал внутри «главного» окна.

Ниже на скриншоте показан пример простого приложения и приложения MDI.

Простое приложение MDI приложение

Создание приложения MDI

Для того чтобы создать MDI приложение необходимо у формы, которую планируется сделать «главной» установить свойство IsMdiContainer = true. Тогда она сможет размещать внутри себя дочерние формы.

При вызове дочерних форм, чтобы они размещались внутри «главной», необходимо задать «главную» форму в свойстве MdiParent.

Ниже приведён пример вызова дочерней формы из главной.

Статья: Построение многооконных приложений для Windows

Календарь. Генератор звуковых волн

После запуска C++ Builder в вашем распоряжении имеется только одна форма Form1 – стартовая форма будущего приложения для Windows. Если вы хотите построить приложение, использующее в своей работе, например, три окна – кликните мышью на значок New Form (Новая форма) два раза. Вы получили две новые формы: Form2 и Form3. Такого же результата можно добиться по-другому. А именно в меню File выберите команду New, а затем Form. Во время работы приложения на экране могут одновременно отображаться все три формы, или любые две, либо любая одна из них. Для того чтобы из любой формы можно было управлять остальными формами, их файлы Unit1.h, Unit2.h и Unit3.h необходимо связать. В заголовочной части файла Unit1.cpp для первой формы нужно дописать директивы:

#include «Unit2.h» //включить вторую форму в проект

#include «Unit3.h» //включить третью форму в проект

Расположите их под уже имеющейся директивой, которую сгенерировала сама среда разработки во время создания первой формы:

#include «Unit1.h» //включить первую форму в проект

Для второй и третьей форм сделать аналогичные записи в файлах Unit2.cpp и Unit3.cpp. После этого формы начнут «чувствовать» друг друга – станет возможно управление из любой формы оставшимися другими. Если в процессе разработки многооконного приложения какая-либо из форм окажется недоступной, для ее появления на экране выберите в меню View (Просмотр) команду Forms… (Формы) или с клавиатуры отработайте клавишный аккорд Shift+F12. Можно просто кликнуть на соответствующий значок с изображением нескольких форм.

На базе связанных между собой форм можно смело приступать к построению многооконного приложения. Для вызова из одной формы другой можно воспользоваться методом Show(), который загрузит указанную форму в оперативную память компьютера и покажет ее на экране. Метод Hide() скрывает форму от взора пользователя, без выгрузки ее из оперативной памяти. Например, строка программного кода, написанная в подходящей процедуре прерывания первой или второй формы, покажет на экране третью форму:

Form3->Show(); //показать третью форму

Убрать эту форму с экрана без выгрузки из оперативной памяти можно с помощью инструкции:

Form3->Hide(); //скрыть третью форму

Полностью закрыть форму можно с помощью инструкции:

Form3->Close(); //выгрузить третью форму

Построим многооконное приложение, состоящее из двух довольно самостоятельных частей. Первая часть будет информировать пользователя о текущих времени и дате, а также будет содержать календарь. Вторая часть предоставит в руки пользователя виртуальный генератор звуковых волн. Такой генератор будет интересен и полезен тем, кто увлекается физикой.

Создайте приложение на базе трех форм и свяжите их между собой. Общие размеры всех форм уменьшите примерно в два раза и расположите их пока произвольно в разных частях экрана. Измените заголовки каждой формы приложения. Пусть окна будут называться: «Главное меню», «Электронные часы. Календарь» и «Виртуальный генератор звуковых волн». Снабдите первую и вторую форму подходящими фоновыми рисунками с помощью знакомого уже вам компонента Image.

На первой форме установите две электронные кнопки. Увеличьте их ширину в два-три раза, для того чтобы их можно было подписать «Электронные часы» и «Виртуальный генератор» соответственно. Напишите функцию обработки Button1Click:

Form2->Show(); //показать вторую форму

Form1->Hide(); //скрыть первую форму

Затем для второй кнопки напишите функцию обработки Button2Click:

Form3->Show(); //показать третью форму

Form1->Hide(); //скрыть первую форму

На второй форме установите электронную кнопку для возврата в главное меню и снабдите ее надписью «Назад». Напишите для нее функцию обработки Button1Click:

Form1->Show(); //показать первую форму

Form2->Hide(); //скрыть вторую форму

Обустройте третье окно аналогично второму, соответственно изменив программный код. У второй и третьей форм удалите три кнопки управления окном. Для этого обратитесь к их составному свойству BorderIcons, которое отвечает за вид окна, кликнув на «плюс». Чтобы исчезли кнопки управления окном, свойству biSystemMenu (Системное меню) придайте значение false.

Запустите приложение на исполнение. Посредством электронных кнопок попробуйте управлять многооконным приложением для Windows. Если все окна корректно появляются и исчезают, то можно достроить второе и третье окна, так чтобы они отвечали задуманному нами в самом начале назначению.

На вторую форму добавьте компоненты Label1 и Label2. Сюда же установите компонент Timer1 из вкладки System и компонент MonthCalendar1 (Ежемесячный календарь) из вкладки Win32. Для компонента Timer1 его свойству Interval придайте значение 10. В функцию обработки Timer1Timer запишите инструкции:

Label1->Caption = Date(); //показать дату

Label2->Caption = Time(); //показать время

Через каждую одну сотую секунды (10 миллисекунд) дата и время будут обновляться. Если вы хотите чтобы дата и время одновременно выводились в одном поле вывода текста Label1, то две предыдущие инструкции можно заменить одной:

Label1->Caption = Now(); //показать дату и время

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

После проверки функций второго окна, можно приступать к построению третьего окна, которое будет представлять виртуальный генератор звуковых волн.

На третью форму добавьте компоненты Button2, Label1, TrackBar1, Image1, Image2. Компонент TrackBar1 (Движок-регулятор) можно извлечь из вкладки Win32. Ширину компонента TrackBar1 увеличьте примерно в два-три раза. Свойству Max (Максимальное положение движка) этого компонента придайте значение 50. Очистите свойство Caption у компонента Label1. В функцию обработки Button2Click впишите инструкцию, которая будет генерировать колебания звуковой частоты:

Beep(TrackBar1->Position*100, 1000); //звук

Этот оператор, отвечающий за генерацию звука, имеет два аргумента. Первый задает частоту звука в герцах, второй – длительность в миллисекундах. Свойство Position (Позиция движка) компонента TrackBar1 управляет изменением частоты звука. В нашем случае можно получить звук частотой от 100 до 5000 Гц с шагом в 100 Гц длительностью в одну секунду. Электронную кнопку Button2Click назовите «Пуск». Генератор уже работоспособен, но для вывода информации о частоте звука необходимо в функцию обработки TrackBar1Change (Изменение позиции движка) записать инструкцию:

Label1->Caption = «Частота звука = » +

Заметьте, здесь одна инструкция записана с переносом, а поэтому расположилась в двух строках.

Запустите приложение и проверьте работоспособность третьего окна. Поэкспериментируйте с оператором звука Beep, изменяя оба его аргумента. Будьте осторожны с величиной второго аргумента, так как он отвечает за время звучания.

Добавьте в окно генератора простейшую анимацию. Для этого вставьте два подходящих изображения, которые будут отображать состояние генератора, в поля компонентов Image1, Image2. Этими изображениями могут быть, например, обезьяна в двух разных состояниях. Когда генератор молчит – обезьяна в задумчивости, когда присутствует звук – обезьяна улыбается разводит руки. Оба изображения наложите, друг на друга, так как появляться они будут в разное время. Свойству Visible компонента Image2 придайте значение false. Теперь функция обработки Button2Click будет выглядеть так:

Beep(TrackBar1->Position*100, 1000); //звук

Image1->Visible = true; //показать первый рисунок

Image2->Visible = false; //скрыть второй рисунок

Необходимо так же будет написать функцию обработки Button2MouseDown:

Image1->Visible = false; //скрыть первый рисунок

Image2->Visible = true; //показать второй рисунок

Запустите приложение. Посмотрите, как теперь работает виртуальный генератор в сопровождении анимации.

Самостоятельно достройте третье окно, так чтобы можно было регулировать длительность звучания, например, до трех секунд с шагом в полсекунды. Для регулировки длительности звука воспользуйтесь компонентом TrackBar2. Для вывода информации о длительности звукового сигнала используйте компонент Label2.

Читайте также:  Гаджет цпу для windows
Оцените статью
Название: Построение многооконных приложений для Windows
Раздел: Рефераты по информатике, программированию
Тип: статья Добавлен 08:52:08 05 мая 2007 Похожие работы
Просмотров: 124 Комментариев: 15 Оценило: 3 человек Средний балл: 5 Оценка: неизвестно Скачать