オブジェクト指向でサブクラス化というと継承を意味するようですが、今回取り上げるサブクラス化は Windows メッセージを処理する意味で使っています。

 通常 Windows メッセージを処理する場合は、Control クラスまたはそれから派生したクラスを継承して WndProc メソッドをオーバーライドします。これだけで十分なのですが、他にも Windows メッセージを扱う方法があります。それが NativeWindow クラスです(VB と C# のサンプルは 旧版を参照)。

 NativeWindow クラスを使用する利点として Windows メッセージの処理を一つのクラスとしてまとめる事ができます。そのため、様々なコントロールに対して同じ Windows メッセージの処理を組み込む場合に役に立ちます。

NativeWindow クラスの簡単な実装例
Public Class PaintNativeWindow
    Inherits NativeWindow

    Private Const WM_PAINT As Integer = &HF
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        MyBase.WndProc(m)

        If m.Msg = WM_PAINT Then
            ' WM_PAINT メッセージの処理 
        End If
    End Sub
End Class
Public Class Form1
    Private pnw As New PaintNativeWindow
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' PaintNativeWindow が Form1 の WM_PAINT メッセージの処理を行う 
        pnw.AssignHandle(Me.Handle) 
    End Sub
End Class
Public Class Form2
    Private pnw As New PaintNativeWindow
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' PaintNativeWindow が Form2 の WM_PAINT メッセージの処理を行う 
        pnw.AssignHandle(Me.Handle) 
    End Sub
End Class

 もう一つの利点としては、ウィンドウハンドルさえ取得できればどんなコントロールであっても Windows メッセージを扱えてしまうということです。つまりコントロールを継承せずとも Windows メッセージを扱えてしまうのです。これを利用するとコンボボックスでは通常取得できない WM_PASTE といったメッセージでも、コンボボックス内部のエディトボックスのハンドルを取得することで出来るようになります。詳しくは「コンボボックスの右クリックの貼り付けイベント取得について」を参照。