Parent和Owner的关系(注意不是VCL概念).
以前提过类似问题,没有回答.
在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函数?