Как стать автором
Обновить

Боковая панель в MDI-container

Преамбула


Понадобилось мне написать программу (под себя) для ведения документации и вывода её на печать. Обдумано, выпито, приступил к изучению 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 очень лёгкий язык, и не пытается разжечь холивар. Данный язык лёгок для меня (в пределах нужд) из всех нынешних из-за привычного синтаксиса.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.