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