我使用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取决于我不希望在这里硬编码的一些条件,它们是从传入参数中获得的。
答案 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