オブジェクト指向でサブクラス化というと継承を意味するようですが、今回取り上げるサブクラス化は Windows メッセージを処理する意味で使っています。
通常 Windows メッセージを処理する場合は、Control クラスまたはそれから派生したクラスを継承して WndProc メソッドをオーバーライドします。これだけで十分なのですが、他にも Windows メッセージを扱う方法があります。それが NativeWindow クラスです(VB と C# のサンプルは 旧版を参照)。
NativeWindow クラスを使用する利点として Windows メッセージの処理を一つのクラスとしてまとめる事ができます。そのため、様々なコントロールに対して同じ Windows メッセージの処理を組み込む場合に役に立ちます。
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
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
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
pnw.AssignHandle(Me.Handle)
End Sub
End Class
もう一つの利点としては、ウィンドウハンドルさえ取得できればどんなコントロールであっても Windows メッセージを扱えてしまうということです。つまりコントロールを継承せずとも Windows メッセージを扱えてしまうのです。これを利用するとコンボボックスでは通常取得できない WM_PASTE といったメッセージでも、コンボボックス内部のエディトボックスのハンドルを取得することで出来るようになります。詳しくは「コンボボックスの右クリックの貼り付けイベント取得について」を参照。