Pull to refresh

Боковая панель в 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 очень лёгкий язык, и не пытается разжечь холивар. Данный язык лёгок для меня (в пределах нужд) из всех нынешних из-за привычного синтаксиса.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.