VB.NET Tips - ComboBoxの簡単な拡張クラス

VB.NETの ComboBox には枠線(ボーダー)を表示するプロパティが標準ではありません。
ComboBoxFlatStyleFlat に設定すると、 枠線が白色になりよく見えなくなります。 そこで、 ComboBox の簡単な拡張クラスをとして枠線の色を追加のプロパティとして作成しました。
クラス名は名前は ComboBoxEx とします。

ウインドウメッセージの処理の中で、 WM_PAINT のメッセージの処理でコンボボックスコントロールの枠を描画します。 枠線を指定する為のプロパティを BorderColor として定義しています。

ComboBoxの簡単な拡張クラス

Imports System
Imports System.ComponentModel
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Windows.Forms

''' 
''' 拡張コンボボックスコントロール
''' 
''' 
Public Class ComboBoxEx
    Inherits System.Windows.Forms.ComboBox

    Private Const WM_PAINT As Integer = &HF

    ''' 
    ''' コンストラクタ
    ''' 
    Sub New()
        'ComboBoxのコンストラクタを呼ぶ
        MyBase.New()
    End Sub

    ''' 
    ''' Windowsメッセージ処理
    ''' 
    ''' 
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case WM_PAINT
                'ペイントイベントでデフォルトの処理をさせる
                MyBase.WndProc(m)
                'その後で強制的に枠描画
                Call DrawRectangle()

            Case Else
                MyBase.WndProc(m)
        End Select
    End Sub

    ''' 
    ''' 枠描画関数
    ''' 
    ''' 再定義可能関数
    Protected Overridable Sub DrawRectangle()
        'グラフィッククラスの参照取得
        Dim g As Graphics = Me.CreateGraphics()
        '枠の四角い領域
        Dim rect As Rectangle = Me.ClientRectangle
        '描画用のペン生成
        Dim framePen As New Pen(Me.BorderColor)
        Try
            '枠描画
            g.DrawRectangle(framePen, rect.X, rect.Y, rect.Width - 1, rect.Height - 1)
        Catch ex As Exception
        Finally
            'ペンの解放
            framePen.Dispose()
        End Try
    End Sub

    'ボーダー色退避
    Private _BorderColor As Color = System.Drawing.SystemColors.ControlText

    ''' 
    ''' ボーダー色プロパティ
    ''' 
    ''' Color値
    ''' Color値
    Public Property BorderColor() As Color
        Get
            Return Me._BorderColor
        End Get
        Set(ByVal value As Color)
            Me._BorderColor = value
        End Set
    End Property

End Class

このクラスを clsComboBoxEx.vb の様な名前で保存し、一度コンパイルすると、ツールボックスの中に ComboBoxExが現れるので、それをフォームに貼り付けます。 フォームに張り付けた時のプロパティウインドウに BorderColor があることがわかります。

フォームにComboBoxExを2個貼り付け、それぞれのボーダーを赤と青に設定した例を示します。