再帰的関数のすすめ2

vbコントロール色ぬりぬり編です。Formのコントロールまとめて塗れます。色は自分できめてね☺

Imports System.Drawing
Imports System.Windows.Forms

Public gCurColors As gStcCtrlColor              '現在セットされている配色値構造体

 '配色値構造体
    Public Structure gStcCtrlColor
        Dim ForeColor As Color
        Dim ContainerBackColor As Color
        Dim BtnColor As Color
        Dim BtnMouseOverColor As Color
        Dim BtnMouseDownColor As Color
        Dim BtnCurrentColor As Color
        Dim GridFixedBackColor As Color
        Dim GridFixedForeColor As Color
        Dim GridBackColor1 As Color
        Dim GridForeColor1 As Color
        Dim GridBackColor2 As Color
        Dim GridForeColor2 As Color
        Dim SubBackColor As Color
        Dim SubBtnColor As Color
        Dim SplitColor As Color
        Dim LinkColor As Color
        Dim ActiveLinkColor As Color
        Dim TextBackColor As Color
    End Structure

    ''' <summary>
    ''' コントロールの色を変える
    ''' </summary>
    ''' <param name="avParents">親コントロール</param>
    ''' <param name="avControls">子コントロール</param>
    ''' <param name="avListSkipCtrl">スキップするコントロール名リスト</param>
    ''' <remarks></remarks>
    Public Sub ColorChange(ByVal avParents As Control, ByVal avControls As Control.ControlCollection, Optional ByVal avListSkipCtrl As List(Of String) = Nothing)
        Dim mb As Reflection.MethodBase = Reflection.MethodInfo.GetCurrentMethod()
        Dim strMyName As String = mb.DeclaringType.Name & "." & mb.Name

        Try
            If IsNothing(avParents) = False Then
                '親コントロール
                With gCurColors
                    'コントロールのタイプに応じて配色処理
                    Select Case avParents.GetType.Name
                        Case "GroupBox"
                            Dim tempGlp As New GroupBox
                            '色を変更するgroupBoxを取得
                            tempGlp = avParents
                            '色を変更
                            tempGlp.ForeColor = .ForeColor
                            tempGlp.BackColor = .ContainerBackColor

                        Case "Panel"
                            Dim tempPnl As New Panel
                            '色を変更するPanelを取得
                            tempPnl = avParents
                            '色を変更
                            tempPnl.BackColor = .ContainerBackColor

                        Case "FlowLayoutPanel"
                            Dim tempflp As New FlowLayoutPanel
                            '色を変更するFlowLayoutPanelを取得
                            tempflp = avParents
                            '色を変更
                            tempflp.BackColor = .ContainerBackColor

                        Case "SplitContainer"
                            Dim tempSpl As New SplitContainer
                            '色を変更するSplitContainerを取得
                            tempSpl = avParents
                            '色を変更
                            tempSpl.BackColor = .SplitColor

                        Case "SplitterPanel"
                            Dim tempSplPnl As SplitterPanel
                            '色を変更するSplitContainerを取得
                            tempSplPnl = avParents
                            tempSplPnl.BackColor = .ContainerBackColor

                        Case "TabControl"
                            Dim tempTabCtrl As New TabControl
                            '色を変更するTabControlを取得
                            tempTabCtrl = avParents
                            '色を変更
                            tempTabCtrl.BackColor = .ContainerBackColor

                        Case "TabPage"
                            Dim tempTabPage As New TabPage
                            '色を変更するTabPageを取得
                            tempTabPage = avParents
                            '色を変更
                            tempTabPage.BackColor = .ContainerBackColor

                        Case Else
                            'その他コンテナコントロール
                            avParents.BackColor = .ContainerBackColor

                    End Select
                End With
            End If

            If IsNothing(avControls) = False Then
                '対象コントロール群
                For I As Integer = 0 To avControls.Count - 1

                    '除外するコントロール名か検索
                    If IsNothing(avListSkipCtrl) = False AndAlso avListSkipCtrl.Contains(avControls(I).Name) Then Continue For

                    '子コントロールがある場合、再帰的にこの関数を呼び出す
                    If avControls(I).HasChildren Then
                        '再帰的に呼び出し
                        ColorChange(Nothing, avControls(I).Controls, avListSkipCtrl)
                    End If

                    With gCurColors
                        'コントロールのタイプに応じて配色処理
                        Select Case avControls(I).GetType.Name
                            Case "Button"
                                Dim tempBtn As New Button
                                '色を変更するボタンを取得
                                tempBtn = avControls(I)
                                '色を変更
                                tempBtn.FlatStyle = FlatStyle.Flat
                                tempBtn.BackColor = .BtnColor
                                tempBtn.FlatAppearance.BorderColor = .ForeColor
                                tempBtn.FlatAppearance.MouseOverBackColor = .BtnMouseOverColor
                                tempBtn.FlatAppearance.MouseDownBackColor = .BtnMouseDownColor
                                tempBtn.FlatAppearance.CheckedBackColor = .BtnCurrentColor
                                tempBtn.ForeColor = .ForeColor
                                tempBtn.UseVisualStyleBackColor = False

                            Case "Label"
                                Dim tempLbl As New Label
                                '色を変更するラベルを取得
                                tempLbl = avControls(I)
                                tempLbl.ForeColor = .ForeColor
                                tempLbl.BackColor = Color.Transparent

                            Case "LinkLabel"
                                Dim tempLlb As New LinkLabel
                                '色を変更するラベルを取得
                                tempLlb = avControls(I)
                                tempLlb.LinkColor = .LinkColor
                                tempLlb.ActiveLinkColor = .ActiveLinkColor

                            Case "RadioButton"
                                Dim tempOpt As New RadioButton
                                '色を変更するradioButtonを取得
                                tempOpt = avControls(I)
                                'ラジオボタンの表示形式によって配色をわける
                                If tempOpt.Appearance = Appearance.Button Then
                                    '色を変更
                                    tempOpt.BackColor = .BtnColor
                                    tempOpt.FlatAppearance.MouseOverBackColor = .BtnMouseOverColor
                                    tempOpt.FlatAppearance.MouseDownBackColor = .BtnMouseDownColor
                                    tempOpt.FlatAppearance.CheckedBackColor = .BtnCurrentColor
                                    tempOpt.ForeColor = .ForeColor
                                Else
                                    '色を変更
                                    tempOpt.BackColor = Color.Transparent
                                    tempOpt.ForeColor = .ForeColor
                                End If

                            Case "CheckBox"
                                Dim tempChk As New CheckBox
                                '色を変更するcheckBoxを取得
                                tempChk = avControls(I)
                                'ラジオボタンの表示形式によって配色をわける
                                If tempChk.Appearance = Appearance.Button Then
                                    '色を変更
                                    tempChk.BackColor = .BtnColor
                                    tempChk.FlatAppearance.MouseOverBackColor = .BtnMouseOverColor
                                    tempChk.FlatAppearance.MouseDownBackColor = .BtnMouseDownColor
                                    tempChk.FlatAppearance.CheckedBackColor = .BtnCurrentColor
                                    tempChk.FlatAppearance.BorderColor = .ForeColor
                                    tempChk.ForeColor = .ForeColor

                                Else
                                    '色を変更
                                    tempChk.BackColor = Color.Transparent
                                    tempChk.ForeColor = .ForeColor
                                End If

                            Case "GroupBox"
                                Dim tempGlp As New GroupBox
                                '色を変更するgroupBoxを取得
                                tempGlp = avControls(I)
                                '色を変更
                                tempGlp.ForeColor = .ForeColor
                                tempGlp.BackColor = .ContainerBackColor

                            Case "C1FlexGrid"
                                Dim tempGrid As New DataGridView
                                '色を変更するgroupBoxを取得
                                tempGrid = avControls(I)

                                '色を変更
                                tempGrid.ForeColor = .GridForeColor1
                                tempGrid.BackgroundColor = .GridBackColor1
                                tempGrid.AlternatingRowsDefaultCellStyle.ForeColor = .GridForeColor2
                                tempGrid.AlternatingRowsDefaultCellStyle.BackColor = .GridBackColor2
                                tempGrid.ColumnHeadersDefaultCellStyle.ForeColor = .GridFixedForeColor
                                tempGrid.ColumnHeadersDefaultCellStyle.BackColor = .GridFixedBackColor

                            Case "Panel"
                                Dim tempPnl As New Panel
                                '色を変更するPanelを取得
                                tempPnl = avControls(I)
                                '色を変更
                                tempPnl.BackColor = .ContainerBackColor

                            Case "FlowLayoutPanel"
                                Dim tempflp As New FlowLayoutPanel
                                '色を変更するFlowLayoutPanelを取得
                                tempflp = avControls(I)
                                '色を変更
                                tempflp.BackColor = .ContainerBackColor

                            Case "SplitContainer"
                                Dim tempSpl As New SplitContainer
                                '色を変更するSplitContainerを取得
                                tempSpl = avControls(I)
                                '色を変更
                                tempSpl.BackColor = .SplitColor

                            Case "SplitterPanel"
                                Dim tempSplPnl As SplitterPanel
                                '色を変更するSplitContainerを取得
                                tempSplPnl = avControls(I)
                                '色を変更
                                tempSplPnl.BackColor = .ContainerBackColor

                            Case "TabControl"
                                Dim tempTabCtrl As New TabControl
                                '色を変更するTabControlを取得
                                tempTabCtrl = avControls(I)
                                '色を変更
                                tempTabCtrl.BackColor = .ContainerBackColor

                            Case "TabPage"
                                Dim tempTabPage As New TabPage
                                '色を変更するTabPageを取得
                                tempTabPage = avControls(I)
                                '色を変更
                                tempTabPage.BackColor = .ContainerBackColor

                            Case "ListBox"
                                Dim tempList As New ListBox
                                '色を変更するListBoxを取得
                                tempList = avControls(I)
                                '色を変更
                                tempList.ForeColor = .ForeColor
                                tempList.BackColor = .ContainerBackColor

                            Case "StatusStrip"
                                Dim tempStrip As New StatusStrip
                                '色を変更するStatusStripを取得
                                tempStrip = avControls(I)
                                '色を変更
                                tempStrip.BackColor = .ContainerBackColor

                            Case "TextBox"
                                Dim tempText As New TextBox
                                '色を変更するTextBoxを取得
                                tempText = avControls(I)
                                '色を変更
                                tempText.BackColor = .TextBackColor

                            Case "RichTextBox"
                                Dim tempRichText As New RichTextBox
                                '色を変更するRichTextBoxを取得
                                tempRichText = avControls(I)
                                '色を変更
                                tempRichText.BackColor = .TextBackColor

                            Case "TreeView"
                                Dim tempTreeView As New TreeView
                                '色を変更するRichTextBoxを取得
                                tempTreeView = avControls(I)
                                '色を変更
                                tempTreeView.ForeColor = .ForeColor
                                tempTreeView.BackColor = .ContainerBackColor
                        End Select
                    End With
                Next
            End If

        Catch ex As Exception
            Throw ex
        End Try
    End Sub