BROWSEINFO的对象成员hwndOwner指的是对话框的所有者,这个所有者代表什么?

来源:百度知道 编辑:UC知道 时间:2024/09/23 11:18:44
说明:
我建立了一个对话框程序,在主对话框上有一个按钮,其ID是:IDC_BUTTON,
我有如下程序:
BROWSEINFO lpbi ;
LPTSTR namePath = new char[MAX_PATH] ;
lpbi.hwndOwner = GetDlgItem(IDC_BUTTON)->GetSafeHwnd() ;
lpbi.pidlRoot = NULL ;
lpbi.pszDisplayName = namePath ;
lpbi.lpszTitle = "lpszTitle" ;
lpbi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT ;
lpbi.lpfn = NULL ;
//显示外壳文件夹以供用户选择
LPITEMIDLIST lpitemidlist = SHBrowseForFolder(&lpbi) ;
我很奇怪为什么:
lpbi.hwndOwner = GetDlgItem(IDC_BUTTON)->GetSafeHwnd() ;这里是将IDC_BUTTON的窗口句柄赋给了pbi.hwndOwner.个人认为是应该将主对话框的句柄赋值给pbi.hwndOwner才对,不知道哪里理解出问题了.望前辈高人纠正.

你好。
windows的窗口大致有三类,对应的术语是:层叠窗口(layered window)、弹出式窗口(popup window)和子窗口(child window)。
另外有两个术语:父窗口(parent window)和所有者窗口(owner window)
父窗口是相对于子窗口而言的。
所有者窗口是相对于弹出式窗口而言的。
你说的hwndOwner就是指目录对话框的所有者窗口是谁,因为目录对话框是弹出式对话框,因此它所使用的术语是所有者窗口而不是父窗口。
行为表现:
1)子窗口只能活动与父窗口的客户区中,绝对不可能跑出客户区。
2)相对于子窗口而言的父窗口,如果他的上面没有其他父窗口了,那么他就是一种层叠窗口。顾名思义,层叠窗口之间是可以互相叠在一起的。
3)弹出式窗口其实就是一种模式对话框,如果他有所有者窗口的话,那么当弹出式窗口没有被关闭时,所有者窗口是无法被我们激活的(即你点一下窗口中的按钮没反应,标题栏是浅色的)。当弹出式窗口未指定所有者窗口的话,那它的行为表现和层叠窗口差不多。就是弹出式窗口没有被关闭的话,也不会影响到其他窗口的活动。

因此,当BROWSEINFO结构的hwndOwner等于NULL的话,你可以看下目录对话框打开后,并不会影响到我们自己窗口的活动,但如果hwndOwner指定了我们自己的窗口的话,那么当目录对话框打开后,我们的窗口是无法活动的。
由此,代码lpbi.hwndOwner = GetDlgItem(IDC_BUTTON)->GetSafeHwnd();其实是错的,
要制定也必定是这样:
lpbi.hwndOwner = GetSafeHwnd();//把对话框的句柄赋给hwndOwner,不是按钮的句柄。

还有是hwndOwner一定要指定的,不能用NULL,否则两个窗口之间就没有交流了,至于这个要怎么解释有点复杂,不多说了。和线程挂起、函数阻塞等概念有关。没有所有者窗口,2个窗口之间的交流必须完全靠程序员自己来负责。
另外,你这里的代码还是没有初始化lpbi啊。