Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Панель инструментов: кнопка закрытия, лэйбл, Как сделать паналь 
:(
    Опции темы
percilacus
Дата 13.9.2009, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.8.2009
Где: RemoteDetent

Репутация: нет
Всего: нет



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


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

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  MyToolStrip1.exe 32,00 Kb
PM MAIL WWW   Вверх
diadiavova
Дата 13.9.2009, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
percilacus
Дата 14.9.2009, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.8.2009
Где: RemoteDetent

Репутация: нет
Всего: нет



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

Да наверно есть готовый. Тем более что почти все программы  используют такие панельки.
Пробовал гуглить но кроме своего сообщения на этом форуме больше ничего не нашел  smile
Насчет дропинга в контейнер (имеется в виду контрол ToolStripContainer ): трудно запрограммировать чтобы при приближении к ToolStripPanel панель автоматически туда дропилась
PM MAIL WWW   Вверх
diadiavova
Дата 14.9.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



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

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

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

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

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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
percilacus
Дата 15.9.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.8.2009
Где: RemoteDetent

Репутация: нет
Всего: нет



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

Со стандартными видимо никак не получится. Я даже забытый ToolBar юзал но свойства Caption или что нибудь подобное там нет.  smile 
PM MAIL WWW   Вверх
diadiavova
Дата 15.9.2009, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Ну вообще-то в дотнете вместо кэпшнов всяких Text


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
percilacus
Дата 17.9.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.8.2009
Где: RemoteDetent

Репутация: нет
Всего: нет



Можно как вариант создать дочернюю форму с привычным заголовком и заполнить ее панелью инструментов. Тогда все это вместе и будет панелью инструментов. Я такую реализацию во многих программах видел.
Только заголовок полуцаиццо синенькый! smile 
PM MAIL WWW   Вверх
diadiavova
Дата 17.9.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0846 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.