Parent和Owner的关系(注意不是VCL概念).

binbin 2003-05-17 06:53:09
以前提过类似问题,没有回答.
在Windows下一个窗口如有父窗口,可以有两类,一类是Parent,一类是Owner,据我观察是不一样的.
获取一个窗口的Parent窗口,可以使用GetParent函数,获取一个窗口的Owner窗口,则需要使用GetWindow函数,最后一个参数用GW_OWNER,

Parent与Owner窗口有很少不同,
比如子窗口会显示在Parent窗口的客户区内,而对于Owner窗口就没有这个限制.当Parent窗口隐藏时,子窗口也会被隐藏,而Owner窗口被隐藏后,子窗口不会被隐藏.

关于窗口是Owner而不是Parent的一个最典型的例子就是很经典的VCL主窗口.
我想很多人都已经知道用Delphi/CB开发的程序主窗口不是直正的主窗口,而是一个隐藏的Application->Handle指向的窗口吧,任务栏上的按钮就是它的杰作.用Spy++捕获主Form后可以看到,Parent Window:(None),而Owner Window:(001029DA),说明Application->Handle是Form1->Handle的Owner window而非Parent window. 我们用ShowWindow(Application->Handle,SW_HIDE)来隐藏任务栏按钮就是因为它是一个Owner窗口,它的消失不影响Form1的显示,如果是Parent窗口,Form1也会消失.我也找到了另一个同样技术的例子,多媒体开发工具Director生成的Projector也是同样的做法.

另一个例子是标准的Windows消息框MessageBox,它的第一个参数就是Owner window,之所以我认为是Owner window,是因为消息框是浮在桌面上而不是在主窗口的客户区内的,当设为NULL时,它就可以和主窗口并行并在任务栏上生成按钮.如果我们在显示消息框前,在主窗口上使用一个Timer控件不断查找这个消息框句柄并用SetParent函数将其设为主窗口的子窗口后,你会发现消息框弹出后在Timer 时间一到就跑到主窗口的客户区里去了. 这也说明了Owner和Parent的区别.

windows API对Parent window的说明比较全面,而且有SetParent API函数可以设置一个窗口的Parent window,可是对于Owner window,我除了在GetWindow中看到一个GE_OWNER flag外没有看到过其他资料,所以我的问题是:

1.如何设置一个窗口是另一个窗口的Owner窗口,就象SetParent那样?
2.如果实现VCL窗口这种效果,即做一个放在屏幕外的窗口显示在任务栏上,然后用另一个窗口通过设置Owner为主窗口来假冒主窗口,而不显示任务栏按钮?我想这也是比ToolWindow风格更好的不生成任务栏按钮的方法,毕竟ToolWindow的标题条太难看了.
3.关于Owner属性的操作,还有哪些API函数?
...全文
146 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
binbin 2003-05-30
  • 打赏
  • 举报
回复
我是没有看,因为我用MSDN,可是MSDN中说得反而没有这么详细,这是我能找到的owner windowr信息

owned window
A window that has an owner. Being owned affects the window's position in the Z order and its visibility and can determine when the window is destroyed.
owner window
A window that affects aspects of another window's appearance and behavior.
binbin 2003-05-29
  • 打赏
  • 举报
回复
FrameSniper:
楼主,我看你还是去看看MSDN或Delphi的SDK帮助吧,上面解释的非常详细啊
---------------------------------------------------------------------
你倒是找几页出来看看呢?

westfly(西翔):

MSDN中关于hWndParent参数这是样的:
Handle to the parent or owner window of the window being created. To create a child window or an owned window, supply a valid window handle. This parameter is optional for pop-up windows.

好象也是把parent和owner混在一起说的,并没说明其中的区别.
microjuz 2003-05-29
  • 打赏
  • 举报
回复
不是太懂,只好up了,keke
PhilexPei 2003-05-29
  • 打赏
  • 举报
回复
TForm是个TWinControl,TWinControl是个TComponent
所以你的效果一定是可以实现的
我尝试写了如下代码:
procedure TForm1.FormCreate(Sender: TObject);
begin
Form2 := TForm.Create(self);
Form2.ShowModal;
end;
其实这样Form2的Owner就是Form1了
基本实现了你的效果。呵呵
FrameSniper 2003-05-29
  • 打赏
  • 举报
回复
To 楼主

我看你就没有仔细看过Delphi里面的SDK帮助!!!!

SDK----Microsoft Win32 Programmer's Guide----Windows----Child Window/Owned Window/Disabled Window

上面这个路径下面的三个内容你看过了吗?相似的内容MSDN上有更详细的说明...,你看过了????

你这种问题完全没有必要找多高水平的人给你来回答,自己有兴趣就去翻资料....
PhilexPei 2003-05-29
  • 打赏
  • 举报
回复
懂你的意思了。试试看吧
PhilexPei 2003-05-29
  • 打赏
  • 举报
回复
property Owner: TComponent read FOwner;
property Parent: TWinControl read FParent write SetParent;
这就是区别咯

PhilexPei 2003-05-29
  • 打赏
  • 举报
回复
做个标记
westfly 2003-05-26
  • 打赏
  • 举报
回复
只能在CreateWindowEx时指定,创建之后恐怕不能再改了。
FrameSniper 2003-05-26
  • 打赏
  • 举报
回复
楼主,我看你还是去看看MSDN或Delphi的SDK帮助吧,上面解释的非常详细啊

大概意思我知道,但我表达不清楚.....
binbin 2003-05-26
  • 打赏
  • 举报
回复
再顶,我看这个贴子在得到正确答案前会有多少up.
高手何在?
这好象是windows程序员最基础的问题,可是...
binbin 2003-05-25
  • 打赏
  • 举报
回复
加到200分了.
xxiao07 2003-05-23
  • 打赏
  • 举报
回复
我要听,还要保存,谢谢!
xxiao07 2003-05-23
  • 打赏
  • 举报
回复
up
binbin 2003-05-23
  • 打赏
  • 举报
回复
没人懂吗?
gjgj3368 2003-05-21
  • 打赏
  • 举报
回复
up
yyszh 2003-05-21
  • 打赏
  • 举报
回复
我忙,听一会就走,不坐了。
iec 2003-05-20
  • 打赏
  • 举报
回复
关注!!!!!!!!!
sbbmu 2003-05-19
  • 打赏
  • 举报
回复
up
hitbabiq 2003-05-19
  • 打赏
  • 举报
回复
关注,不太明白!
加载更多回复(3)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧