{"id":100150,"date":"2016-01-26T00:38:35","date_gmt":"2016-01-25T16:38:35","guid":{"rendered":"http:\/\/www.ilzhi.cn\/?p=100150"},"modified":"2016-01-26T00:38:35","modified_gmt":"2016-01-25T16:38:35","slug":"%e3%80%90vb-net%e3%80%91%e5%b8%a6%e5%85%b3%e9%97%ad%e6%8c%89%e9%92%ae%e7%9a%84%e9%80%89%e9%a1%b9%e5%8d%a1","status":"publish","type":"post","link":"http:\/\/www.ilezhi.cn\/?p=100150","title":{"rendered":"\u3010VB.NET\u3011\u5e26\u5173\u95ed\u6309\u94ae\u7684\u9009\u9879\u5361"},"content":{"rendered":"<pre class=\"lang:vbnet decode:true \" title=\"\u5e26\u5173\u95ed\u6309\u94ae\u7684\u9009\u9879\u5361\">'\u6765\u6e90\uff1ahttp:\/\/www.vbforums.com\/showthread.php?622242-TabControl-with-Close-button-on-TabPages-(with-Design-Time-support)\r\n\r\nOption Strict On\r\nImports System.ComponentModel\r\n\r\n\r\n\r\n&lt;ToolboxBitmap(GetType(System.Windows.Forms.TabControl))&gt;\r\nPublic Class TabControlEx\r\n    Inherits System.Windows.Forms.TabControl\r\n\r\n    Private Declare Auto Function SetParent Lib \"user32\" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr\r\n    Protected CloseButtonCollection As New Dictionary(Of Button, TabPage)\r\n    Private _ShowCloseButtonOnCurrentTab As Boolean = True\r\n    Private _ShowCloseButtonOnTabs As Boolean = False\r\n\r\n\r\n    &lt;Browsable(True), DefaultValue(True), Category(\"Behavior\"), Description(\"Indicates whether a close button should be shown on each TabPage\")&gt;\r\n    Public Property ShowCloseButtonOnCurrentTab() As Boolean\r\n        Get\r\n            Return _ShowCloseButtonOnCurrentTab\r\n        End Get\r\n        Set(ByVal value As Boolean)\r\n            _ShowCloseButtonOnCurrentTab = value\r\n            For Each btn In CloseButtonCollection.Keys\r\n                btn.Visible = _ShowCloseButtonOnCurrentTab\r\n            Next\r\n            RePositionCloseButtons()\r\n        End Set\r\n    End Property\r\n\r\n\r\n    &lt;Browsable(True), DefaultValue(True), Category(\"Behavior\"), Description(\"Indicates whether a close button should be shown on each TabPage\")&gt;\r\n    Public Property ShowCloseButtonOnTabs() As Boolean\r\n        Get\r\n            Return _ShowCloseButtonOnTabs\r\n        End Get\r\n        Set(ByVal value As Boolean)\r\n            _ShowCloseButtonOnTabs = value\r\n\r\n            RePositionCloseButtons()\r\n        End Set\r\n    End Property\r\n\r\n    Protected Overrides Sub OnCreateControl()\r\n        MyBase.OnCreateControl()\r\n\r\n\r\n        For Each item In CloseButtonCollection\r\n            item.Value.Text = item.Value.Text.Trim &amp; Space(4)\r\n        Next\r\n\r\n        RePositionCloseButtons()\r\n    End Sub\r\n\r\n    Protected Overrides Sub OnControlAdded(ByVal e As System.Windows.Forms.ControlEventArgs)\r\n        MyBase.OnControlAdded(e)\r\n        Dim tp As TabPage = DirectCast(e.Control, TabPage)\r\n        Dim rect As Rectangle = Me.GetTabRect(Me.TabPages.IndexOf(tp))\r\n        Dim btn As Button = AddCloseButton(tp)\r\n        btn.Size = New Size(rect.Height - 1, rect.Height - 1)\r\n        btn.Location = New Point(rect.X + rect.Width - rect.Height - 1, rect.Y + 1)\r\n        SetParent(btn.Handle, Me.Handle)\r\n        AddHandler btn.Click, AddressOf OnCloseButtonClick\r\n        CloseButtonCollection.Add(btn, tp)\r\n    End Sub\r\n\r\n    Protected Overrides Sub OnControlRemoved(ByVal e As System.Windows.Forms.ControlEventArgs)\r\n        Dim btn As Button = CloseButtonOfTabPage(DirectCast(e.Control, TabPage))\r\n        RemoveHandler btn.Click, AddressOf OnCloseButtonClick\r\n        CloseButtonCollection.Remove(btn)\r\n        SetParent(btn.Handle, Nothing)\r\n        btn.Dispose()\r\n        MyBase.OnControlRemoved(e)\r\n    End Sub\r\n\r\n    Protected Overrides Sub OnLayout(ByVal levent As System.Windows.Forms.LayoutEventArgs)\r\n        MyBase.OnLayout(levent)\r\n        RePositionCloseButtons()\r\n    End Sub\r\n\r\n    Public Event CloseButtonClick As CancelEventHandler\r\n    Protected Overridable Sub OnCloseButtonClick(ByVal sender As Object, ByVal e As EventArgs)\r\n        If Not DesignMode Then\r\n            Dim btn As Button = DirectCast(sender, Button)\r\n            Dim tp As TabPage = CloseButtonCollection(btn)\r\n            Dim ee As New CancelEventArgs\r\n            RaiseEvent CloseButtonClick(sender, ee)\r\n\r\n            If Not ee.Cancel Then\r\n                If MsgBox(\"\u662f\u5426\u5173\u95ed \" + tp.Text.Trim + \"\u6807\u7b7e?\") = MsgBoxResult.Ok Then\r\n                    Me.TabPages.Remove(tp)\r\n                    RePositionCloseButtons()\r\n                End If\r\n            End If\r\n            End If\r\n    End Sub\r\n\r\n    Protected Overridable Function AddCloseButton(ByVal tp As TabPage) As Button\r\n        Dim closeButton As New Button\r\n        With closeButton\r\n            '' TODO: Give a good visual appearance to the Close button, maybe by assigning images etc.\r\n            ''       Here I have not used images to keep things simple.\r\n            .Text = \"X\"\r\n            .FlatStyle = FlatStyle.Flat\r\n            .BackColor = Color.FromKnownColor(KnownColor.ButtonFace)\r\n            .ForeColor = Color.White\r\n            .Font = New Font(\"Microsoft Sans Serif\", 6, FontStyle.Bold)\r\n        End With\r\n        Return closeButton\r\n    End Function\r\n\r\n    Public Sub RePositionCloseButtons()\r\n        For Each item In CloseButtonCollection\r\n            RePositionCloseButtons(item.Value)\r\n        Next\r\n    End Sub\r\n\r\n    Public Sub RePositionCloseButtons(ByVal tp As TabPage)\r\n        Dim btn As Button = CloseButtonOfTabPage(tp)\r\n        If btn IsNot Nothing Then\r\n            Dim tpIndex As Integer = Me.TabPages.IndexOf(tp)\r\n            If tpIndex &gt;= 0 Then\r\n                Dim rect As Rectangle = Me.GetTabRect(tpIndex)\r\n                If Me.SelectedTab Is tp Then\r\n                    btn.BackColor = Color.Red\r\n                    btn.Size = New Size(rect.Height - 1, rect.Height - 1)\r\n                    btn.Location = New Point(rect.X + rect.Width - rect.Height, rect.Y + 1)\r\n                    btn.Visible = ShowCloseButtonOnCurrentTab\r\n                Else\r\n                    btn.BackColor = Color.FromKnownColor(KnownColor.ButtonFace)\r\n                    btn.Size = New Size(rect.Height - 3, rect.Height - 3)\r\n                    btn.Location = New Point(rect.X + rect.Width - rect.Height - 1, rect.Y + 1)\r\n                    btn.Visible = Me.ShowCloseButtonOnTabs\r\n                End If\r\n\r\n                btn.BringToFront()\r\n            End If\r\n        End If\r\n    End Sub\r\n\r\n    Protected Function CloseButtonOfTabPage(ByVal tp As TabPage) As Button\r\n        Return (From item In CloseButtonCollection Where item.Value Is tp Select item.Key).FirstOrDefault\r\n    End Function\r\nEnd Class<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8216;\u6765\u6e90\uff1ahttp:\/\/www.vbforums.com\/showthread.php?622242-TabCo &hellip; <a href=\"http:\/\/www.ilezhi.cn\/?p=100150\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">\u3010VB.NET\u3011\u5e26\u5173\u95ed\u6309\u94ae\u7684\u9009\u9879\u5361<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[66,24,64,30,29],"class_list":["post-100150","post","type-post","status-publish","format-standard","hentry","category-share","tag-microsoft","tag-vb-net","tag-visual-studio","tag-30","tag-29"],"_links":{"self":[{"href":"http:\/\/www.ilezhi.cn\/index.php?rest_route=\/wp\/v2\/posts\/100150","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.ilezhi.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.ilezhi.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.ilezhi.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.ilezhi.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=100150"}],"version-history":[{"count":0,"href":"http:\/\/www.ilezhi.cn\/index.php?rest_route=\/wp\/v2\/posts\/100150\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.ilezhi.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=100150"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.ilezhi.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=100150"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.ilezhi.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=100150"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}