Собственно, понадобилось мне это при написании курсовой, а именно – текстового редактора.
В силу того, что в учебном заведении основным является 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(); }
Дальше осталось совсем немного, добавить реализацию MDI.
В этом нам поможет свойство IsMDIContainer для родительской формы, в значении true, и одна дополнительная форма, которая и будет отображаться в родительской.
Процесс создания дочерних и родительских MDI форм подробно изложен в соответствующем разделе MSDN.
Вот что в итоге у меня получилось:
Пожалуй, на что ещё стоит обратить внимания, это способ переключения между интерфейсами. Здесь полный полёт фантазии, хоть анимашку с тумблером ставь, буквально.
Для скорости и простоты разработки, я использовал предоставленную Visual Studio страницу с параметрами проекта.
Очень надеюсь, что данный топик кому-нибудь да принесёт пользу.
Дерзайте! И удачи во всех ваших проектах!
Всем Мир!
Автор: Mozhitel