使用窗口句柄作为 VB6 窗体的所有者
Posted
技术标签:
【中文标题】使用窗口句柄作为 VB6 窗体的所有者【英文标题】:Use a window handle as an owner for a VB6 form 【发布时间】:2011-10-19 22:21:05 【问题描述】:Form2.Show vbModeless, Form1
的 Win32 等效项是什么,它允许我将所有者(而不是父级)设置为任意 hWnd 并设置默认位置等?
据我所知,这只能在创建窗口时设置。
【问题讨论】:
在我打电话给.Show
之前,我现在已经通过自己定位来解决这个问题(当然要考虑多台显示器)
除 CreateWindow[Ex] 外,您还可以使用 SetWindowLong[Ptr]
和 GWL_HWNDPARENT
作为 'nIndex' 来设置所有者窗口。
在 DevX 上找到这篇文章。你的问题几乎是逐字逐句的。 devx.com/vb2themax/Tip/18318
我已经很多年没有看过 DevX,我没有意识到它仍然存在 :) 这正是我想要的,但有多个显示器的怪癖(正是我想要的这段代码修复)所以我会坚持使用自定义代码来获取监视器并将其居中。不过,我可能会在以后调整,因为始终处于最佳状态。谢谢
仅供参考,在 VB6 中卸载所有者表单也会卸载所有“由它拥有”的表单,这与仅 API 拥有的 hWnd 的一个主要区别。
【参考方案1】:
我不确定您要完成什么,但我认为您可能正在寻找 SetParent 函数。
Declare Function SetParent Lib "user32.dll" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
hWndChild 是子窗口的句柄。hWndNewParent 是新父窗口的句柄。传递 null(如果我没记错的话是 0)使桌面成为所有者。
你可以找到更多关于它的信息here。
【讨论】:
不,我试图设置所有者(在模态、某些焦点等时禁用)而不是父级(嵌入在另一个窗口中)谢谢。 是的,这对于顶层窗口是正确的。建议使用 SetParent() 而不是 SetWindowLongPtr() 来设置所有者窗口。 @Hans - 你错了,你不能用 SetParent 设置所有者窗口,即使是***窗口也会在 'hWndNewParent' 窗口中作为父窗口。 @Sertac - 不,SetParent() 不会在顶层窗口上设置 WS_CHILD 样式位。检查 MSDN 文档。还要注意使用 CreateWindowEx() 的 hwndParent 参数来创建一个拥有的窗口。 SetWindowLong/Ptr() 的 GWL_HWNDPARENT 值已从文档中删除。 @Hans - MSDN 关于 WS_CHILD 标志的意思是,“API 正在设置父级,但您自己处理自己的样式”。 SetParent 的文档中没有提及所有权。事实上,我能找到的关于该主题的唯一文档是 “在创建拥有的窗口后,应用程序无法将窗口的所有权转移到另一个窗口。” Window Features。 GWL_HWNDPARENT 可能已从文档中删除,但目前它是创建窗口后唯一有效的方法。以上是关于使用窗口句柄作为 VB6 窗体的所有者的主要内容,如果未能解决你的问题,请参考以下文章