Работа с многооконным интерфейсом в Visual Basic 2008
Дата изменения: 12 июля 2018
* Задание: Преобразовать приложение из занятия № 16 «Обработка событий мыши» в приложение с многодокументным интерфейсом.
Выполнение:
Многодокументный интерфейс Windows (MDI) позволяет программам работать с множеством форм, расположенных в одной родительской форме. Применение MDI сделает интерфейс программы более аккуратным, поскольку находящиеся в нем формы не будут разбросаны по всему экрану.
Стандарт MDI позволяет совершенствовать программы в двух направлениях. Во-первых, Вы сможете ограничиться одной формой-контейнером, которая станет рабочим фоном приложения. Если пользователь переместит контейнер, вместе с ним переместятся и все дочерние формы, что сделает интерфейс программы организованным и самодостаточным. Во-вторых, что еще важнее, пользователь может одновременно работать с несколькими документами.
MDI-приложения позволяют использовать несколько экземпляров одной и той же формы, что увеличивает производительность и гибкость ваших программ.
- Рассмотрим на примере, как работает MDI-интерфейс, усовершенствовав наш графический редактор.
- Загрузите в окно редактора проект приложения из занятия № 16 «Обработка событий мыши». Основной форме проекта дайте имя frmPicture. Она в дальнейшем будет выступать в роли макета дочерней формы.
- Добавьте в проект родительскую MDI-форму с помощью команды меню Project → Add Windows Form → MDI Parent Form (Проект → Добавить форму Windows → Родительская форма MDI). На панели свойств задайте ей имя mdiGeneral. Установите значение свойства Text родительской формы равным Графический редактор Художник 1.0.
- Теперь настроим дочернюю форму frmPicture. Установите значение свойства Text для нее равным Рисунок.
Каждое загруженное дочернее окно занимает некоторый объем оперативной памяти. Поэтому, если предполагается интенсивно использовать в программе несколько экземпляров дочерних окон, необходимо свести в них к минимуму объем программного кода и количество элементов управления. В противном случае, приложение может резко замедлить работу компьютера из-за нехватки оперативной памяти.
Родительская MDI-форма является контейнером, в котором располагаются все дочерние окна. Поэтому именно она ответственна за создание дочерних окон. Кроме того, в родительской форме обычно хранятся совместно используемые элементы интерфейса, например, такие как панель инструментов, строка состояния и т.д.
- Обратите внимание, что родительская форма имеет собственное меню. Перейдите на меню родительской формы и измените процедуру для пункта меню
Private Sub ShowNewForm(ByVal sender As Object, ByVal e As EventArgs) Handles NewToolStripMenuItem. Click,NewToolStripButton.Click, NewWindowToolStripMenuItem.Click ' Создать новый экземпляр дочерней формы. Dim ChildForm As New frmPicture ' Сделать ее дочерней для данной формы MDI перед отображением. ChildForm.MdiParent = Me m_ChildFormNumber += 1 ChildForm.Text = "Рисунок " & m_ChildFormNumber ChildForm.Show() End Sub |
Давайте разберемся в приведенном листинге. Вначале, в операторе объявления Dim указано имя объектной переменной (переменной типа Object), в которой будет содержаться экземпляр формы; в объявлении Dim используется ключевое слово New. Затем формируется строка заголовка создаваемой формы (свойство .Text). После того, как создана объектная переменная для вывода формы на экран, используется метод Show() для отображения формы. Однако вместо имени формы ему задается имя объектной переменной.
- Установите в качестве формы для запуска родительскую MDI-форму (меню Проект → Свойства: WindowsApplication…) и запустите проект. При выборе меню File → New (Файл → Создать) запускается дочерняя форма, но меню на форме не активно.
- Перейдите на форму frmPicture и перенесите полностью меню с дочерней формы на родительскую форму (вырезав элемент меню из дизайна дочерней формы и вставив на родительскую). Точно также вырежьте из кода программы тот фрагмент кода дочерней формы, который относится к пунктам меню, и вставьте его в код родительской формы. В результате на дочерней форме не должно остаться ни одного элемента управления.
- Добавьте в проект стандартный модуль и из кода дочерней формы вставьте туда описание переменных, изменив Private на Public:
Public КнопкаНажата As Boolean Public ИнструментКвадрат As Boolean Public ИнструментЛиния As Boolean |
- Запустите проект . Сначала выберие меню File → New (Файл → Создать), а затем Инструмент. Нарисуйте что-нибудь на форме. А затем еще раз выберите меню File → New (Файл → Создать) – появился новый экземпляр формы!
- Скорее всего, Вы обратили внимание на два неудобства. Первое: при запуске новой формы никакой инструмент не активен. Добавьте в обработку процедуры пункта меню New (Создать) (ShowNewForm) следующий фрагмент:
ИнструментКвадрат = True |
- Кроме того, если Вы хотите, чтобы при запуске программы появлялось окно для нового рисунка, то добавьте в модуль родительской формы следующий код:
Private Sub MDIGeneral_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ShowNewForm(sender, e) End Sub |
- Сразу же можете поменять меню с англоязычного на русский язык, изменив подписи меню в дизайне формы.
- Добавим код в обработку события меню Open (Открыть). Открывать будем файл-изображение (расширение
bmp), загружая его в качестве фона активной дочерней формы:
Private Sub OpenFile(ByVal sender As Object, ByVal e As EventArgs) Handles OpenToolStripMenuItem.Click, OpenToolStripButton.Click Dim OpenFileDialog As New OpenFileDialog OpenFileDialog.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments OpenFileDialog.Filter = "Text Files (*.bmp)|*.bmp|All Files (*.*)|*.*" If (OpenFileDialog.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK) Then Dim FileName As String = OpenFileDialog.FileName ' TODO: Add code here to open the file. Dim ChildForm As New frmPicture Me.ActiveMdiChild.BackgroundImage = Image.FromFile(FileName) End If End Sub |
- Посмотрите на то, как ведут себя остальные пункты. Можете их удалить или попробовать адаптировать под программу.
- Сохраните проект и запустите программу. Создайте пару новых дочерних окон и посмотрите, как ведут себя дочерние формы внутри родительской. Чтобы лучше понять особенности их поведения выполните следующие действия:
- Минимизируйте дочернюю форму и обратите внимание на расположение ее пиктограммы.
- Переместите дочернюю форму. Она не выйдет за границы окна родительской формы.
- Максимизируйте дочернюю форму.
- Минимизируйте и максимизируйте родительскую форму.
Наконец, немного полезной информации. При работе с MDI-приложениями широко используются два особенных ключевых слова – Me и ActiveMdiChild. Ключевое слово Ме используется в любой форме для ссылки на нее саму. В свойстве родительской формы ActiveMdiChild находится указатель на активную в текущий момент дочернюю форму.
Дополнительное задание:
Самостоятельно усовершенствуйте панель меню, добавив все возможные необходимые пункты.
Вопросы для самоконтроля:
- Для чего предназначен MDI-интерфейс? В чем его преимущество перед обычным интерфейсом?
- Что представляет собой MDI-форма?
- Что представляет собой дочерняя форма?
- Для чего используется ключевое слово Me?
* При использовании материалов обязательна ссылка на источник: Майер С.Ф., «MS Visual Basic 2008» — Учебно-методическое пособие : Южный федеральный университет. – Ростов-на-Дону, 2017. – 92 с.
Разместил admin / 17 апреля, 2017 / 0 Комментарии
Создание MDI-приложения. Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание]
Создание MDI-приложения. Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание]ВикиЧтение
Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание]
Троелсен Эндрю
Содержание
Создание MDI-приложения
Чтобы завершить краткое знакомство с Windows Forms, давайте обсудим то, как настроить форму на работу в качестве родительского объекта для любого числа дочерних окон (т.е. в качестве MDI-контейнера). MDI-приложения дают пользователям возможность открывать множество дочерних окон в рамках одного и того же главного окна. В мире MDI каждое окно представляет свой «документ» приложения. Например, Visual Studio 2005 является МDI-приложением, поскольку вы можете открыть множество документов в рамках одного экземпляра этого приложения.
При построении МDI-приложения с помощью Windows Forms первой задачей оказывается (конечно же) создание нового приложения Windows. Исходная форма в приложении обычно содержит систему меню, которая позволяет создавать новые документы (например, содержит пункт Файл?Создать) и упорядочивать существующие открытые окна (каскадом, по вертикали или по горизонтали).
Для создания дочерних окон обычно определяется форма-прототип, играющая роль основы для каждого дочернего окна. Поскольку Form является типом класса, любые приватные данные, определенные в дочерней форме, будут для конкретного экземпляра уникальными. Например, при созданий MDI-приложения текстового редактора для отображения текста можно создать дочернюю форму, поддерживающую StringBuilder. Если пользователь создаст пять новых дочерних окон, каждая соответствующая форма будет поддерживать свой собственный экземпляр StringBuilder, которыми можно будет управлять независимо.
Кроме того, MDI-приложения позволяют «объединять» меню. Как уже упоминалось, родительские окна обычно имеют свои системы меню, которые позволяют пользователю создавать и упорядочивать дополнительные дочерние окна. Но что будет в том случае, когда дочернее окно имеет свою систему меню? Если пользователь максимизирует конкретное дочернее окно, то система меню этого дочернего окна должна «поглотиться» родительской формой, чтобы пользователь получил возможность активизировать элементы каждой из имеющихся систем меню. Пространство имен Windows Forms определяет ряд свойств, методов и событий, позволяющих программное слияние систем меню. Имеется также система «слияния по умолчанию», которая оказывается вполне подходящей во многих типичных случаях.
Глава 27 Создание сетевого приложения в Linux
Глава 27 Создание сетевого приложения в Linux В главе 6 я ввел основные сетевые понятия, перечислил самые популярные протоколы и вкратце рассказал об основе сети Интернет — протоколе TCP/IP. В этой главе я собираюсь подробнее остановиться на протоколах TCP/IP и ICMP и показать,
Создание приложения в среде MS Visual C++ 5.
0Создание приложения в среде MS Visual C++ 5.0 Перед началом работы необходимо скопировать файлы glut.h, glut32.lib glut32.dll в каталоги…MSVCIncludeGl,…MSVCLib,…WindowsSystem соответственно. Также в этих каталогах надо проверить наличие файлов gl.h, glu.h, opengl32.lib, glu32.lib, opengl32.dll, glu32.dll, которые обычно входят в
Создание приложения в среде Borland C++ 5.02
Создание приложения в среде Borland C++ 5.02 Как и для Visual C++, сначала надо обеспечить наличие файлов glut.h, glut32.lib, glut32.dll в каталогах…BorlandCIncludeGl,…BorlandCLib,…WindowsSystem соответственно. Также в этих каталогах надо проверить наличие файлов gl.h, glu.h, opengl32.lib, glu32.lib, opengl32.dll, glu32.dll, которые обычно
Создание приложения для просмотра данных
Создание приложения для просмотра данных В предыдущем примере показан простейший способ связывания данных на основе извлечения всей таблицы и отображения ее в элементе управления DataGrid. А как отобразить только одну запись? Для этого потребуется использовать элементы
Создание пользовательского приложения для просмотра метаданных
Создание пользовательского приложения для просмотра метаданных Чтобы очертить общие контуры процесса отображения (а также привести пример использования System.Type), мы создадим консольное приложение, которое назовем MyTypeViewer. Эта программа будет отображать подробную
Создание расширяемого приложения
Создание расширяемого приложения В следующих разделах мы с вами проанализируем пример, иллюстрирующий процесс создания расширяемого приложения Windows.Forms, которое можно будет расширять за счет функциональных возможностей внешних компоновочных блоков. Сам процесс
Создание распределенного приложения
Создание распределенного приложения Ничто не принесет большей радости, чем создание реального распределенного приложения на новой платформе. Чтобы показать, как быстро можно создать и запустить приложение, использующее слой удаленного взаимодействия .NET, мы построим
Создание приложения клиента
Создание приложения клиента Теперь, когда вы лучше понимаете внутреннюю композицию генерируемого агента, давайте попытаемся его использовать. Создайте новое консольное приложение с именем CalculatorClient, добавьте в проект файл proxy.cs с помощью выбора Project?Add Existing Item из меню и
Создание приложения без формы
Создание приложения без формы В некоторых случаях необходимо иметь приложение, которое, запустившись, не выводит на экран форму или вообще не имеет и не создает форм. Создать такое приложение очень просто. Эта технология рассматривается в следующем
Создание приложения для смартфона
Создание приложения для смартфона В главе 7 уже создавался проект, рассчитанный на работу с смартфоном. Мы тогда немного забежали вперед. Настало время вернуться к истокам и начать изучение с самого начала.Запустите Visual Studio 2005 для создания нового проекта. Надо выбрать тип
Создание приложения средствами MFC AppWizard
Создание приложения средствами MFC AppWizard Во второй главе книги мы рассматривали приложение MFDialog, которое не имеет главного окна. Вместо окна это приложение использует обыкновенную диалоговую панель. Сейчас мы расскажем вам как создать приложение, подобное MFDialog, не набрав
Приложения MDI — Программирование Visual Basic .NET [Книга]
Интерфейс для нескольких документов (ДИ) приложения позволяют открывать более одного документа одновременно. Этот в отличие от интерфейса единого документа (SDI) приложений, которые могут манипулировать только одним документом за раз. Visual Studio .NET — это пример приложения MDI — множество исходных файлов и дизайн представления могут быть открыты сразу. Напротив, Блокнот является примером Приложение SDI — открытие документа закрывает все ранее открытые документ.
В приложениях MDI есть нечто большее, чем их способность иметь несколько файлы открываются сразу. SDK платформы Microsoft Windows определяет несколько вариантов поведения пользовательского интерфейса, которые должны реализовывать приложения MDI. Операционная система Windows поддерживает такое поведение, и эта поддержка также предоставляется через Windows Forms.
Родительская и дочерняя формы
Приложения MDI состоят из основной формы, который сам не отображает никаких данных и одну или несколько дочерних форм, которые появляются только в основной форме и используются для отображения документы. Основная форма называется Родительский MDI , а дочерние формы называются дочерними MDI .
Класс Form имеет два свойства, которые определяют, будет ли данная форма является родителем MDI, дочерним MDI или ни тем, ни другим. Логическое значение IsMdiContainer Свойство определяет, будет ли форма вести себя как родитель MDI. MdiParent свойство (которое имеет тип Form) определяет, ведет ли себя форма как ребенок МДИ. Установка свойства MdiParent формы для ссылки родительская форма MDI приложения делает форму дочерней MDI форма. Пример 4-6 показывает минимальный объем кода требуется для отображения родительской формы MDI, содержащей один дочерний MDI форма.
Пример 4–6. Минимальное приложение MDI
Imports System Импортирует System.Windows.Forms Публичный модуль AppModule Публичная вспомогательная основная( ) Application.Run (Новая основная форма ()) Конец сабвуфера Конечный модуль Основная форма публичного класса Наследует форму Публичная подписка Новая( ) ' Установить заголовок главного окна. Текст = "Мое приложение MDI" ' Установите это как родительскую форму MDI. ИсМдиКонтейнер = Истина 'Создать дочернюю форму. Dim myChild As New DocumentForm ("Мой документ", Me) myChild.Show Конец сабвуфера Конец класса Открытая форма документа класса Наследует форму Public Sub New (имя ByVal как строка, родитель ByVal как форма) ' Установить заголовок окна документа. Текст = имя ' Установите это как дочернюю форму MDI. MdiParent = родитель Конец сабвуфера Конец класса
Предположим, что код из примера 4-6 сохранен в
файл с именем MyApp.vb
, его можно скомпилировать из
командную строку с этой командой:
vbc MyApp.vb /r:System.dll,System.Windows.Forms.dll
При запуске полученного исполняемого файла отображается экран, показанный на рис. 4-7.
Рис. 4-7. Минимальное приложение MDI (вывод кода в примере 4-6)
Класс Form имеет два свойства только для чтения, связанные с поведением MDI. Свойство IsMdiChild возвращает логическое значение. значение, указывающее, является ли форма дочерним элементом MDI. Свойство MdiChildren родительской формы содержит коллекцию ссылок на дочерние формы формы. Свойства IsMdiChild и MdiChildren автоматически поддерживается в ответ на установку MdiParent дочерних форм характеристики.
Создание оконного меню
MDI-приложения обычно имеют пункт главного меню под названием Window. В этом меню появляются стандартные элементы для каскадирования, мозаичного размещения и активации дочерних окон и расположение значков свернутых дочерних окон. На рис. 4-8 показан типичный пример.
Рис. 4-8. Типичное меню окна
Такое меню легко создать с помощью поддержки в Windows Forms. Предполагая, что вы должны были сделать это программно, в примере 4.7 показана исправленная версия примера 4.6, которая была изменена для включения окна. меню; добавленный код выделен жирным шрифтом. Подробности о том, как работать с меню из Visual Studio IDE, а также программно, см. раздел 5.5 в главе 5.
Пример 4–7. Приложение MDI с меню Window
Imports System Импортирует System.Windows.Forms Публичный модуль AppModule Публичная вспомогательная основная( ) Application.Run (Новая основная форма ()) Конец сабвуфера Конечный модуль Основная форма публичного класса Наследует форму' Объявить главное меню MainForm
Частный myMainMenu As MainMenu
' Объявить меню Windows
Protected WithEvents mnuWindow As MenuItem
Protected WithEvents mnuTileHoriz As MenuItem
Protected WithEvents mnuCascade As MenuItem
Protected WithEvents mnuTileVert As MenuItem
Protected WithEvents mnuArrangeAll As MenuItem
Публичная подписка Новая( ) ' Установить заголовок главного окна. Текст = "Мое приложение MDI" ' Установите это как родительскую форму MDI. ИсМдиКонтейнер = Истина'Создать главное меню
MyMainMenu = Новое ГлавноеМеню()
' Определить пункты меню
mnuWindow = Новый Элемент Меню()
mnuTileHoriz = Новый элемент меню()
mnuTileVert = Новый элемент меню()
mnuCascade = Новый элемент меню()
mnuArrangeAll = Новый элемент меню()
' Установить свойства меню
mnuWindow.Text = "&Окно"
mnuWindow.MdiList = Истина
mnuTileHoriz.Text = "Плитка по горизонтали"
mnuTileVert. Text = "Плитка по вертикали"
mnuCascade.Text = "Каскад"
mnuArrangeAll.Text = "Упорядочить значки"
' Добавить пункты в меню
MyMainMenu.MenuItems.Add(mnuWindow)
mnuWindow.MenuItems.Add(mnuCascade)
mnuWindow.MenuItems.Add(mnuTileHoriz)
mnuWindow.MenuItems.Add(mnuTileVert)
mnuWindow.MenuItems.Add(mnuArrangeAll)
' Назначить меню форме
Me.Menu = MyMainMenu
'Создать дочернюю форму. Dim myChild As New DocumentForm ("Мой документ", Me) myChild.Show Конец сабвуфераPublic Sub mnuCascade_Click (o как объект, e как EventArgs) _
Ручки mnuCascade. Click
LayoutMdi(MdiLayout.Каскад)
Концевой переводник
Public Sub mnuTileHoriz_Click (o как объект, e как EventArgs) _
Ручки mnuTileHoriz.Click
LayoutMdi(MdiLayout.TileHorizontal)
Конечный переходник
Public Sub mnuTileVert_Click (o как объект, e как EventArgs) _
Ручки mnuTileVert.Click
LayoutMdi(MdiLayout.TileVertical)
Концевой переводник
Public Sub mnuArrangeAll_Click (o как объект, e как EventArgs) _
Ручки mnuArrangeAll.Click
LayoutMdi(MdiLayout.ArrangeIcons)
Концевой переводник
Конец класса Открытая форма документа класса Наследует форму Public Sub New (имя ByVal как строка, родитель ByVal как форма) ' Установить заголовок окна документа. Текст = имя ' Установите это как дочернюю форму MDI. MdiParent = родитель Конец сабвуфера End Class
Чтобы добавить меню «Окно» в родительскую форму приложения MDI,
выполните следующие шаги. Сначала добавьте пункт меню в родительский MDI.
главное меню формы, установив для свойства Text любое желаемое значение
(обычно Window
) и его свойство MdiList для Правда
. Именно свойство MdiList делает
Меню окна Меню окна. Установка свойства MdiList в True
заставляет платформу Windows Forms добавлять и
Удалить
пункты меню в этот пункт меню и из него, как
необходимый. Это, в свою очередь, всегда будет отображать текущий список MDI.
дочерние окна в меню.
Далее добавьте пункты меню для Каскад, Плитка по горизонтали, Плитка по вертикали и Расставить иконы. В обработчике события Click для каждого из этих пунктов меню вызовите LayoutMdi класса Form. метод, передавая соответствующее значение параметра для желаемого действие.
Синтаксис метода LayoutMdi:
Public Sub LayoutMdi(ByVal value As MdiLayout)
Единственный аргумент метода должен быть значением из MdiLayout перечисление (определенное в пространстве имен System.Windows.Forms). значения в этом перечислении:
-
Расставить иконки
Указывает, что значки свернутых дочерних окон MDI должны быть аккуратно устроены.
-
Каскад
Указывает, что дочерние окна MDI должны располагаться каскадно (отображается перекрывают друг друга).
-
ПлиткаГоризонтальная
Указывает, что дочерние окна MDI должны быть мозаичными (отображается без перекрытия), с каждым дочерним окном, заполняющим ширину родитель МДИ.
-
Вертикальная плитка
Указывает, что дочерние окна MDI должны быть мозаичными, с каждым дочерним окно, заполняющее высоту родителя MDI.
Объединение меню
Часто, элементы, которые должны отображаться в главном меню приложения MDI зависят от типа отображаемого документа или от того, любой документ отображается вообще. Конечно, этот эффект может быть достигается в коде путем динамического добавления и удаления пунктов меню каждый раз. время активации дочернего окна. Однако формы Windows framework обеспечивает более простой способ.
Если дочерняя форма MDI имеет собственное главное меню, она и форма MDI Главное меню родительской формы объединяется для создания меню, которое отображается пользователю при отображении дочерней формы. Два свойства класс MenuItem влияет на то, как элементы меню объединяются. Во-первых, Свойство MergeOrder определяет порядок расположения пунктов меню. отображается. Этому свойству может быть присвоено любое целочисленное значение. значения не обязательно должны быть смежными. Пункты меню из двух меню сортируются по этому значению, чтобы определить порядок, в котором пункты меню отображаются на экране.
Например, рассмотрим родительскую форму MDI, которая имеет главное меню с три пункта меню, представляющие меню «Файл», «Окно» и «Справка». Дальше, скажем, что свойства MergeOrder этих пунктов меню равны 10, 20, и 30 соответственно. Теперь, если отображается дочерняя форма MDI и ее в главном меню есть, например, пункт Edit со свойством MergeOrder При значении 15 отображаемое пользователю меню будет состоять из четырех пунктов: «Файл», «Правка», «Окно» и «Справка» в указанном порядке. В примере 4-8 показана исправленная версия примера 4-6, содержащая код, необходимый для создания такое меню; линии, выделенные жирным шрифтом, были добавлены для определения Главное меню и его пункты меню.
Пример 4–8. Приложение MDI с объединенными меню
Система импорта Импортирует System.Windows.Forms Публичный модуль AppModule Публичная вспомогательная основная( ) Application.Run (Новая основная форма ()) Конец сабвуфера Конечный модуль Основная форма публичного класса Наследует форму' Объявить главное меню MainForm.
Частный myMainMenu As MainMenu
' Объявить меню Окно.
Protected WithEvents mnuFile As MenuItem
Protected WithEvents mnuWindow As MenuItem
Protected WithEvents mnuHelp As MenuItem
Публичная подписка Новая( ) ' Установить заголовок главного окна. Текст = "Мое приложение MDI" ' Установите это как родительскую форму MDI. ИсМдиКонтейнер = Истина' Создать главное меню
MyMainMenu = Новое ГлавноеМеню()
' Определить пункты меню
mnuFile = Новый Элемент Меню()
mnuWindow = Новый Элемент Меню()
mnuHelp = Новый элемент меню()
' Установить свойства меню
mnuFile. Text = "&Файл"
mnuFile.MergeOrder = 10
mnuWindow.Text = "&Окно"
mnuWindow.MergeOrder = 20
mnuWindow.MdiList = Истина
mnuHelp.Text = "&Справка"
mnuHelp.MergeOrder = 30
' Добавить пункты в меню
MyMainMenu.MenuItems.Add(mnuFile)
MyMainMenu.MenuItems.Add(mnuWindow)
MyMainMenu.MenuItems.Add(mnuHelp)
' Назначить меню форме
Me.Menu = MyMainMenu
'Создать дочернюю форму. Dim myChild As New DocumentForm ("Мой документ", Me) myChild.Show Конец сабвуфера Конец класса Открытая форма документа класса Наследует форму' Объявить меню
Частный mdiMenu как новый MainMenu
' Объявить пункты меню
Protected WithEvents mnuEdit As MenuItem
Public Sub New (имя ByVal как строка, родитель ByVal как форма) ' Установить заголовок окна документа. Текст = имя ' Установите это как дочернюю форму MDI. MdiParent = родитель' Создать меню и пункты меню
mdiMenu = Новое ГлавноеМеню()
mnuEdit = Новый элемент меню()
' Установить свойства меню
mnuEdit.Text = "&Редактировать"
mnuEdit.MergeOrder = 15
' Добавить пункт в главное меню
mdiMenu.MenuItems.Add(mnuEdit)
' Добавить меню в дочернее окно
Me.Menu = mdiMenu
Конец сабвуфера Конец класса
Если элемент меню в меню дочерней формы MDI имеет один и тот же MergeOrder значение как пункт меню в меню родительской формы MDI, второе свойство вступает в игру. Свойство MergeType обоих элементов MenuItem объекты исследуются, а поведение определяется сочетание их значений. Свойство MergeType имеет тип MenuMerge (перечисление, определенное в System.Windows.Forms namespace) и может иметь одно из следующих значений:
-
Добавить
Пункт меню отображается как отдельный пункт в целевом меню, независимо от настройки MergeType другого пункта меню имущество.
-
Элементы слияния
Если для свойства MergeType другого пункта меню также установлено значение
MergeItems
, два пункта меню объединяются в один элемент в целевом меню. Затем слияние применяется рекурсивно к подпунктам исходных меню, используя их MergeOrder и Свойства типа слияния.Если для свойства MergeType другого пункта меню установлено значение
Добавить
, оба пункта меню появляются в целевом меню (так же, как если бы оба указалиДобавить
).Если для свойства MergeType другого пункта меню установлено значение
Удалить
, в таргете появляется только этот пункт меню меню (опять же, то же самое, что указатьДобавить
для этого пункт меню).Если для свойства MergeType другого пункта меню установлено значение
Заменить
, только пункт меню дочерней формы отображается независимо от того, какой из них установленMergeItems
и какой из них установленЗаменить
. (Это похоже на непоследовательное поведение а может это баг)-
Удалить
Пункт меню не отображается в целевом меню, независимо от установка свойства MergeType другого пункта меню.
-
Заменить
Если для свойства MergeType другого пункта меню установлено значение
Добавить
, оба пункта меню появляются в целевом меню (так же, как если бы оба указалиДобавить
).Если для свойства MergeType другого пункта меню установлено значение
MergeItems
илиЗаменить
, только отображается пункт меню дочерней формы. (Это кажется несовместимым поведение и может быть ошибкой.)Если для свойства MergeType другого пункта меню также установлено значение
Заменить
, только пункт меню дочерней формы показано.
Обнаружение активации дочернего окна MDI
Код в классе родительской формы MDI может быть уведомлен, когда Дочерняя форма MDI становится активной внутри родительской формы MDI. («Активный» означает, что ребенок форма получает фокус ввода после другой дочерней формы MDI или MDI-формы. родительская форма имела фокус ввода.) Чтобы получить такое уведомление, Родительская форма MDI должна переопределять метод OnMdiChildActivate (определенный в классе формы). Например:
' Поместите это в определение класса родительской формы MDI. Защищенные переопределения Sub OnMdiChildActivate (ByVal e As EventArgs) MyBase.OnMdiChildActivate(e) ' Важно '... Конец суб
Важно вызвать реализацию базового класса OnMdiChildActivate внутри переопределяющей функции, чтобы любой необходимая обработка базового класса (включая поднятие событие MdiChildActivate).
Параметр e
не содержит информации. К
узнать, какая дочерняя форма MDI стала активной, прочитать ActiveMdiChild
свойство родительской формы MDI. Это свойство имеет тип Form.
Преобразуйте его в тип дочерней формы MDI, чтобы получить доступ к любому
общедоступные члены, специфичные для этого типа. Например:
Защищенные переопределения Sub OnMdiChildActivate (ByVale
As EventArgs) MyBase.OnMdiChildActivate(e)' Предполагается, что SomeFormType определен в другом месте и наследует
'из формы. Также предполагается, что дочерний элемент MDI формируется в
' приложения всегда относятся к этому типу.
Dim childForm As SomeFormType = _
CType(ActiveMdiChild, SomeFormType)
' Сделайте что-нибудь здесь с дочерней формой.
'... End Sub
Чтобы код за пределами класса родительской формы MDI уведомлялся, когда Дочерняя форма MDI становится активной, напишите обработчик для родительской формы MDI событие формы MdiChildActivate. Это событие определяется в Сформировать класс как:
Публичное событие MdiChildActivate( _ ByValотправитель
Как объект, _ ByVale
Как EventArgs _ )
отправитель
параметр является родителем MDI
форма, а не активированная дочерняя форма MDI. e
параметр не содержит
дополнительная информация о мероприятии. Как и при переопределении
OnMdiChildActivate, прочитайте родительскую форму MDI.
ActiveMdiChild, чтобы узнать, какая дочерняя форма MDI была
активирован.
Получите курс Programming Visual Basic .NET прямо сейчас с обучающей платформой O’Reilly.
участника O’Reilly проходят онлайн-обучение в режиме реального времени, а также получают книги, видео и цифровой контент почти от 200 издателей.
Начать бесплатную пробную версию
Форма VB.NET MDI — Javatpoint
следующий → ← предыдущая MDI означает приложения Multiple Document Interface , которые позволяют пользователям работать с несколькими документами, открывая более одного документа одновременно. Принимая во внимание, что приложение Single Document Interface (SDI) может работать только с одним документом за раз. Приложения MDI действуют как родительские и дочерние отношения в форме. Родительская форма — это контейнер, содержащий дочерние формы, а дочерних форм может быть несколько для отображения разных модулей в родительской форме. VB.NET имеет следующие правила для создания формы как формы MDI.
Давайте создадим программу для отображения нескольких окон в VB.NET Windows Forms. Шаг 1: Во-первых, мы должны открыть форму Windows и создать строку меню с помощью элемента управления MenuStrip, как показано ниже. Шаг 2: После создания меню добавьте подпункты в строку меню, как показано ниже. На приведенном выше изображении мы определили два подэлемента: первый — это форма обратной связи , а второй — VB.NET. Шаг 3: На третьем шаге мы создадим две формы: дочерняя форма основной формы или Родительская форма . Здесь мы создали первую дочернюю форму с именем Form2. Форма2.vb Форма публичного класса2 Private Sub Form2_Load (отправитель как объект, e как EventArgs) обрабатывает MyBase.Load Me.Text = «Форма обратной связи» ‘ Устанавливаем название формы Label1.Text = «Заполните форму обратной связи» Button1.Text = «Отправить» Button1.BackColor = Цвет.Небесно-голубой Button2.Text = «Отмена» Button2.BackColor = Цвет.Красный Конец сабвуфера Private Sub Button1_Click (отправитель как объект, e как EventArgs) обрабатывает Button1.Click MsgBox(«Успешно отправлена форма обратной связи») Конец сабвуфера Private Sub Button2_Click(sender As Object, e As EventArgs) обрабатывает Button2.Click Me.Dispose() ‘завершить форму2 Конец сабвуфера Конец класса Еще одна дочерняя форма с именем Form3 . Форма3. vb Форма публичного класса3 Private Sub Form3_Load (отправитель как объект, e как EventArgs) обрабатывает MyBase.Load Label1.Text = «Добро пожаловать на сайт учебных пособий по JavaTpoint» Label.BackColor = Цвет.Зеленый Label2.Text = «Это учебник VB.NET, и мы изучаем форму VB.NET MDI» Label2.BackColor = Цвет.Небесно-голубой Конец сабвуфера Конец класса Шаг 4: Теперь мы пишем программный код для основной или родительской формы, и вот код для нашей основной формы. MDI_form.vb Открытый класс MDI_Form Private Sub MDI_Form_Load (отправитель как объект, e как EventArgs) обрабатывает MyBase.Load IsMdiContainer = True ‘Установите для логического значения значение true, чтобы создать форму как форму MDI. Me.Text = «javatpoint.com» ‘установить заголовок формы PictureBox1.Image = Image.FromFile(«C:\Users\AMIT YADAV\Desktop\jtp2.png») PictureBox1. |