Преамбула
Понадобилось мне написать программу (под себя) для ведения документации и вывода её на печать. Обдумано, выпито, приступил к изучению vb.net. Именно бэйсик был выбран потому, что от платформы .net я был далеко и о C# не знал, программы пишу только для себя (т.е. нужен был лёгкий язык), а первым и вторым языком был QBasic и vb соответственно. Для удобства было решено использовать MDI-cоntainer, разделённый на две части (отдельно — иерархия документов и mdi-child'ы). Поиск особых результатов не дал. Более поздний поиск (через полгода) дал более интересные результаты (о них в конце, для не гиков они не актуальны).
Программа создавалась на vb.net при помощи vs 2013.
Фабула
Splitter:
К сожалению сплиттер у меня использовать не получилось, я смог подвигать только при первом запуске проекта, какие-либо элементы управления на сплиттере функционировали нормально. Сhild-форма вела себя более покладистей: изменение размеров упиралось в границы, максимизация переносила панель заголовка корректно.
Как статическая боковая панель использовать можно, хотя Microsoft не рекомендует.
SplitContainer:
Не найдя ничего путного на mdsn'е, было принято решение использовать гугл. Найденные советы не помогали полностью решить проблему с помощью SplitContainer'a.
form.Parent = Me.SplitContainer1.Panel1
С помощью данного кода не удавалось запихнуть в panel1 больше одной формы.
Public Class Form1
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Integer, ByVal hWndNewParent As Integer) As Integer
Private Sub btn_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd.Click
Dim nf As New Form
SetParent(nf.Handle.ToInt32, Me.SplitContainer1.Panel1.Handle.ToInt32)
nf.Show()
End Sub
End Class
Минус этого решения имхо не совсем привычный интерфейс при развёртывании дочерних окон. Более информативно здесь.
Panel:
RTM одарил меня свойством формы maxsize.
Dim childform As New form
With childform
.MdiParent = Me
.MaximumSize = New System.Drawing.Size(Panel1.Left + 14, Me.Height)
.Show()
End With
Панель находится справа, поэтому Panel1.Left (более стандартный вариант me.width — panel1.width). 14 — границы формы, хотя при установке высоты мне их убирать не потребовалось (почему остаётся вопросом).
Минус: попробуйте свернуть в окно (не в панель задач) браузер, а теперь растяните нижнюю границу ниже панели задач. Курсор упирается и не идёт ниже (навряд ли везде, с линуксами не знаком). Подобного при переходе через границу панели нет.
Перемещение границы панели реализовал сунув на неё кнопку, которая двигает панель влево/вправо и изменяет её свойство enabled.
То самое, не для гиков:
Решения сторонних разработчиков. Этот вариант был найден при поиске информации для статьи и мной не рассматривался. Не факт что решение проблемы имеется.
P.S.: Фраза «нужен был лёгкий язык» не утверждает, что vb.net очень лёгкий язык, и не пытается разжечь холивар. Данный язык лёгок для меня (в пределах нужд) из всех нынешних из-за привычного синтаксиса.