2014-12-25 14 views
0

내가 setParent가 불려 갔을 때 사용하는 기본 창에 .NET의 ListView 컨트롤을 호스팅하고 있습니다 : 그것은 자식 창입니다에 내가 호스트 창에서 전송 WM 창 메시지를 가로 챌 수있는 방법호스팅 .NET 컨트롤이

Public Class LVControl 
    Public Shared Lv As New ListView 

    Shared Sub LvInit(ByVal hWnd As IntPtr) 
     Lv.Size = New System.Drawing.Size(256, 256) 
     Lv.Dock = Windows.Forms.DockStyle.Fill 
     Lv.Show() 
     NativeMethods.SetParent(Lv.Handle, hWnd) 
    End Sub 

... 
End Class 

(내 ListView 컨트롤) ? 런타임에 컨트롤을 만들고 부모 폼이 없으므로 (옵션이 아닌) 어떻게 재정의 가능한 WndProc 함수를 구현할 수 있습니까? "기본 클래스의 하위를 재정의하지 않기 때문에 선언 할 수 없습니다."여기에 관리되는 코드를 사용하고 싶습니다. ...

Ps : 이제 부모 기본 윈도우에 대한 NativeWindow 클래스의 구현에 대해 설명합니다. 내 ListView 컨트롤,하지만 잘 모르는 방법을 알고 올바른 방향으로 오전?

UPDATE

감사 의견에, 나는 그것이 작동있어 :

Public Class myListView 
    Inherits ListView 
    Protected Overrides ReadOnly Property CreateParams() As CreateParams 
     Get 
      Dim cp As CreateParams = MyBase.CreateParams 
      Dim hParent As IntPtr '= get parent hWnd here 
      cp.Parent = hParent 
      Return cp 
     End Get 
    End Property 

    Protected Overrides Sub WndProc(ByRef m As Message) 
     'handle messages here 
     MyBase.WndProc(m) 
    End Sub 
End Class 

는 지금은 CreateParams을 특성으로 부모 HWND를 포함하는 매개 변수를 전달하는 방법에 대한 마지막 질문이 있습니까? parent hWnd를 얻는 것은 내가 여기에 하드 코드되기를 원하지 않는 어떤 조건에 달려있다.

+2

을있는 ListView에서 자신의 클래스를 파생와의 WndProc()을 재정의합니다. 또한 CreateParams를 재정의하고 Parent 속성을 설정하여 올바른 코드를 작성할 수 있습니다. –

+0

고마워, 이제 그걸 파헤쳐 볼거야. 간단한 예를 들겠습니다. – ladybug

답변

1

꽤 쉽습니다. 그냥 기본 목록보기에서 새의 ListView 클래스를 상속와의 WndProc 서브를 오버라이드 (override) (한스는 자신의 의견에 쓴 것처럼) :

Public Class LVControl 
    Public Shared Lv As New MyListView 

    Shared Sub LvInit(ByVal hWnd As IntPtr) 
     Lv.Size = New System.Drawing.Size(256, 256) 
     Lv.Dock = Windows.Forms.DockStyle.Fill 
     Lv.Show() 
     NativeMethods.SetParent(Lv.Handle, hWnd) 
    End Sub 
End Class 

Public Class MyListView 
    Inherits ListView 

    Protected Overrides Sub WndProc(ByRef m As Message) 
     MyBase.WndProc(m) 
     'WndProc code here 
    End Sub 
End Class