.NET / [Из песочницы] Реализация SDI и MDI интерфейсов в одном приложении на C#

в 15:11, , рубрики: Без рубрики

Собственно, понадобилось мне это при написании курсовой, а именно – текстового редактора.
В силу того, что в учебном заведении основным является C#, то он и был выбран для разработки программы.

Сразу же возник вопрос, а какой интерфейс реализовать в программе? SDI или MDI? Ведь и у одного и у другого есть свои недостатки и преимущества. Выход нашелся достаточно быстро — реализовать оба интерфейса, и пусть уж пользователь сам решает, в каком работать.

Под катом, моё скромное решение данной задачи.

Первым делом, я решил взяться за SDI. За образец был взят Microsoft Word 2010, а именно поведение при создании нового документа — видимость запуска ещё одной копии приложения. При этом в системе так и остается один процесс, а форму, в которой была нажата кнопка «Создать» при необходимости можно закрыть, что не приведет к закрытию всей программы.

Первая попытка сделать это, была довольно примитивна — просто показать копию основной формы при нажатии на кнопку «Создать». Думаю всем понятно, что решением это не является, так как такая форма дочерняя, и закроется вместе с главной.

Тут я вспомнил про нити (называемые так же потоками), когда то пройденные по дисциплине «Операционные системы». Поиск по МСДН'у, привел меня к классу Thread, который и оказался для меня самым подходящим вариантом.

Мне понадобилось только два метода из этого класса:

  • GetApartmentState, в котором необходимо указать, что мы создаём однопоточный апартамент STA (Апартамент — это логический контейнер, который находится в процессе и обеспечивает общий доступ к объектам для потоков, имеющих одинаковые требования доступа. Все объекты в одном апартаменте могут принимать вызовы от любого другого потока, находящегося в том же апартаменте.), это понадобиться, если из этого потока нам нужно будет вызывать openFileDialog, saveFileDialog и подобное.
  • Start, для запуска потока.

Стоить заметить, что для использования данного класса необходимо добавить пространство имен System.Threading.

Сначала пишем код, который будет исполняться в новом потоке (в данном случае можно скопировать из главной точки входа):

void SDI_newApp()         {             Application.EnableVisualStyles();             Application.SetCompatibleTextRenderingDefault(false);             Application.Run(new form_main());         } 

Далее пишем сам поток:

void SDI_FileNew()         {             Thread _SDI_newApp_Theard = new Thread(new ThreadStart(SDI_newApp));             _SDI_newApp_Theard.SetApartmentState(ApartmentState.STA);             _SDI_newApp_Theard.Start();         } 

Результат:
image

Дальше осталось совсем немного, добавить реализацию MDI.
В этом нам поможет свойство IsMDIContainer для родительской формы, в значении true, и одна дополнительная форма, которая и будет отображаться в родительской.
Процесс создания дочерних и родительских MDI форм подробно изложен в соответствующем разделе MSDN.

Вот что в итоге у меня получилось:
.NET / [Из песочницы] Реализация SDI и MDI интерфейсов в одном приложении на C#

Пожалуй, на что ещё стоит обратить внимания, это способ переключения между интерфейсами. Здесь полный полёт фантазии, хоть анимашку с тумблером ставь, буквально.
Для скорости и простоты разработки, я использовал предоставленную Visual Studio страницу с параметрами проекта.

Очень надеюсь, что данный топик кому-нибудь да принесёт пользу.
Дерзайте! И удачи во всех ваших проектах!
Всем Мир!

Автор: Mozhitel


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js