再帰的関数のすすめ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