在本机窗口中托管.net控件

时间:2014-12-25 17:37:46

标签: .net vb.net interop wndproc

我使用SetParent在本机窗口中托管.NET ListView控件:

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控件)的WM窗口消息?由于我在运行时创建控件并且我没有父表单(并且它不是一个选项)如何实现可覆盖的WndProc函数?它说"它不能被声明,因为它不会覆盖基类中的sub"我想在这里使用托管代码...

P.s:现在我正在使用我的ListView控件的父本机窗口的NativeWindow类的实现,但是不知道如何做得好并且我是否正确的方向?

更新

感谢评论,我得到了它的工作:

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 

现在我有关于如何将包含父hWnd的参数传递给CreateParams属性的最后一个问题?获取父hWnd取决于我不希望在这里硬编码的一些条件,它们是从传入参数中获得的。

1 个答案:

答案 0 :(得分:1)

这很简单。只需从基础ListView继承一个新的ListView类并覆盖WndProc子(就像Hans在他的评论中写的那样):

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