Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Панель инструментов: кнопка закрытия, лэйбл


Автор: percilacus 13.9.2009, 08:56
HI!
Задумал я сделать панель инструментов, выглядящую  как в солидных программах. Например, в Ворде если вытащить панель на середину экрана, то у нее появляется заголовок из названия, кнопки закрытия и еще кое что. Как оказалось эта задача совсем не простая.
Вот что имею:
Код

    Public Class MyToolStrip
        Inherits ToolStrip
        Private fieldheader As ToolStripHeader
        Private fieldcontent As ToolStripContent
        Public Sub New(ByVal label_text As String)
            MyBase.New()
            Me.SuspendLayout()
            fieldheader = New ToolStripHeader(label_text)
            fieldcontent = New ToolStripContent
            Me.Dock = DockStyle.None
            Me.Padding = New Padding(3)
            Me.Renderer = New MyToolStripRenderer
            Me.GripStyle = ToolStripGripStyle.Hidden
            Me.LayoutStyle = ToolStripLayoutStyle.VerticalStackWithOverflow
            Me.MinimumSize = fieldheader.PreferredSize
            Me.Items.Add(New ToolStripControlHost(fieldheader))
            Me.Items.Add(New ToolStripControlHost(fieldcontent))
            Me.ResumeLayout()
        End Sub
        Public ReadOnly Property Header() As ToolStripHeader
            Get
                Return fieldheader
            End Get
        End Property
        Public ReadOnly Property Content() As ToolStripContent
            Get
                Return fieldcontent
            End Get
        End Property
        Protected Overrides Sub OnItemAdded(ByVal e As System.Windows.Forms.ToolStripItemEventArgs)
            MyBase.OnItemAdded(e)
            e.Item.Margin = New Padding(0)
        End Sub
    End Class
    Public Class ToolStripHeader
        Inherits ToolStrip
        Public label As New ToolStripLabel()
        Public closebutton As New ToolStripButton("x")
        Private initlocation As Point
        Public Sub New(ByVal label_text As String)
            MyBase.New()
            Me.SuspendLayout()
            Me.Dock = DockStyle.None
            Me.Renderer = New HeaderRenderer
            Me.LayoutStyle = ToolStripLayoutStyle.HorizontalStackWithOverflow
            Me.GripStyle = ToolStripGripStyle.Hidden
            label.Font = New Font(FontFamily.GenericSansSerif, 8, FontStyle.Bold)
            label.ForeColor = Color.White
            label.Text = label_text
            Me.Items.Add(label)
            Me.Items.Add(closebutton)
            label.Alignment = ToolStripItemAlignment.Left
            closebutton.Alignment = ToolStripItemAlignment.Right
            closebutton.AutoToolTip = False
            AddHandler closebutton.Click, AddressOf closeButton_Click
            Me.ResumeLayout()
        End Sub
        Protected Overrides Sub OnMouseDown(ByVal mea As System.Windows.Forms.MouseEventArgs)
            MyBase.OnMouseDown(mea)
            If mea.Button = Windows.Forms.MouseButtons.Left Then
                Me.Cursor = Cursors.SizeAll
                Me.Capture = True
                initlocation = mea.Location
            End If
        End Sub
        Protected Overrides Sub OnMouseMove(ByVal mea As System.Windows.Forms.MouseEventArgs)
            MyBase.OnMouseMove(mea)
            If mea.Button = Windows.Forms.MouseButtons.Left Then
                Me.Parent.Location += mea.Location - initlocation
            End If
        End Sub
        Protected Overrides Sub OnMouseUp(ByVal mea As System.Windows.Forms.MouseEventArgs)
            MyBase.OnMouseUp(mea)
            Me.Cursor = Cursors.Default
        End Sub
        Private Sub closeButton_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            Me.Parent.Visible = False
        End Sub
    End Class
    Public Class ToolStripContent
        Inherits ToolStrip
        Public Sub New()
            MyBase.New()
            Me.SuspendLayout()
            Me.Renderer = New BaseRenderer
            Me.LayoutStyle = ToolStripLayoutStyle.HorizontalStackWithOverflow
            Me.GripStyle = ToolStripGripStyle.Hidden
            Me.Padding = New Padding(0)
            Me.ResumeLayout()
        End Sub
        Protected Overrides Sub OnItemAdded(ByVal e As System.Windows.Forms.ToolStripItemEventArgs)
            MyBase.OnItemAdded(e)
            If Not TypeOf e.Item Is ToolStripButton Then Exit Sub
            CType(e.Item, ToolStripButton).CheckOnClick = True
        End Sub
        Protected Overrides Sub OnItemClicked(ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs)
            MyBase.OnItemClicked(e)
            For Each obj As ToolStripItem In Me.Items
                If Not TypeOf e.ClickedItem Is ToolStripButton Then Continue For
                CType(obj, ToolStripButton).Checked = False
            Next
        End Sub
    End Class
    Public Class BaseRenderer
        Inherits ToolStripRenderer
        Protected Overrides Sub OnRenderButtonBackGround(ByVal e As System.Windows.Forms.ToolStripItemRenderEventArgs)
            MyBase.OnRenderItemBackground(e)
            If e.Item.Selected And CType(e.Item, ToolStripButton).Checked Then
                e.Graphics.FillRectangle(Brushes.SteelBlue, e.Item.ContentRectangle)
                e.Graphics.DrawRectangle(Pens.Blue, e.Item.ContentRectangle)
            ElseIf e.Item.Selected Or CType(e.Item, ToolStripButton).Checked Then
                e.Graphics.FillRectangle(Brushes.LightBlue, e.Item.ContentRectangle)
                e.Graphics.DrawRectangle(Pens.Blue, e.Item.ContentRectangle)
            End If
        End Sub
        Protected Overrides Sub OnRenderToolStripBackground(ByVal e As System.Windows.Forms.ToolStripRenderEventArgs)
            MyBase.OnRenderToolStripBackground(e)
            e.Graphics.FillRectangle(New SolidBrush(SystemColors.Control), e.AffectedBounds)
        End Sub
    End Class
    Public Class HeaderRenderer
        Inherits BaseRenderer
        Protected Overrides Sub OnRenderToolStripBackground(ByVal e As System.Windows.Forms.ToolStripRenderEventArgs)
            MyBase.OnRenderToolStripBackground(e)
            e.Graphics.FillRectangle(Brushes.Gray, e.AffectedBounds)
        End Sub
    End Class
    Public Class MyToolStripRenderer
        Inherits BaseRenderer
        Protected Overrides Sub OnRenderToolStripBorder(ByVal e As System.Windows.Forms.ToolStripRenderEventArgs)
            MyBase.OnRenderToolStripBorder(e)
            Dim pen As New Pen(SystemColors.ControlDark, 2)
            pen.Alignment = Drawing2D.PenAlignment.Inset
            e.Graphics.DrawRectangle(pen, e.AffectedBounds)
        End Sub
    End Class


Не знаю, может у кого получится лучше. Моя панель не дропиться в контейнер. Это придется программировать, писать дополнительные процедуры. И по-моему тоже совсем совсем не легко

Автор: diadiavova 13.9.2009, 22:33
А почему при перетаскивании на середину экрана не помещать тулстрип в какой-нибудь контейнер(форму например). Хотя, лучше поискать готовый компонент.

Автор: percilacus 14.9.2009, 17:50
Цитата(diadiavova @ 13.9.2009,  22:33)
Хотя, лучше поискать готовый компонент.

Да наверно есть готовый. Тем более что почти все программы  используют такие панельки.
Пробовал гуглить но кроме своего сообщения на этом форуме больше ничего не нашел  smile
Насчет дропинга в контейнер (имеется в виду контрол ToolStripContainer ): трудно запрограммировать чтобы при приближении к ToolStripPanel панель автоматически туда дропилась

Автор: diadiavova 14.9.2009, 19:48
Цитата(percilacus @  14.9.2009,  18:50 Найти цитируемый пост)
Тем более что почти все программы  используют такие панельки.

Фиг знает, может и со стандартными так можно, но не знаю.
Цитата(percilacus @  14.9.2009,  18:50 Найти цитируемый пост)
Пробовал гуглить но кроме своего сообщения на этом форуме больше ничего не нашел  

Надо искать в репозиториях исходников типа кодплекса. Я правда там поискал - ничего кроме рибона(как в офисе 2007) не нашёл. Но это не то.

Цитата(percilacus @  14.9.2009,  18:50 Найти цитируемый пост)
Насчет дропинга в контейнер (имеется в виду контрол ToolStripContainer ): трудно запрограммировать чтобы при приближении к ToolStripPanel панель автоматически туда дропилась 

Я не совсем это имел в виду. Просто когда надо оторвать панель (тлстрип) просто запускай формочку и переноси его туда. Другой вопрос, что вот этот вот момент, когда её надо отрывать поймать у меня не получилось. Дрэгдроп(событие) чойт не срабатывает, хотя пробовал по разному.

Автор: percilacus 15.9.2009, 20:12
Цитата(diadiavova @ 14.9.2009,  19:48)
Цитата(diadiavova)
Фиг знает, может и со стандартными так можно, но не знаю.

Со стандартными видимо никак не получится. Я даже забытый ToolBar юзал но свойства Caption или что нибудь подобное там нет.  smile 

Автор: diadiavova 15.9.2009, 20:42
Ну вообще-то в дотнете вместо кэпшнов всяких Text

Автор: percilacus 17.9.2009, 17:36
Можно как вариант создать дочернюю форму с привычным заголовком и заполнить ее панелью инструментов. Тогда все это вместе и будет панелью инструментов. Я такую реализацию во многих программах видел.
Только заголовок полуцаиццо синенькый! smile 

Автор: diadiavova 17.9.2009, 17:39
Я кагбэ с самого начала об этом и написал. Можно вместо формы самому контейнер сделать любого вида. Проблема отлова того момента, когда надо тулбар перемещать на панель всё равно остаётся.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)