用API改变拥有者窗口,可以做到么? 今天看了MFC的实现,它的setowner()方法就是将Cwnd类中的一个成员变量m_hWndOwner改变一下就OK了,用API怎么做? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://topic.csdn.net/t/20040915/19/3376260.html API方面好像没有提供这样的函数,好像只提供了GetWindow可以获取窗口的所有者。 是啊,不知道MFC是怎样实现这个的! API和MFC本来就不是一回事,怎么能互相代替? http://blog.chinaunix.net/u/28371/showart_400527.html win32 API提供了函数GetWindow函数(GW_OWNER 标志)来获取一个窗口的所有者窗口句柄。 GetWindow(hWnd, GW_OWNER)永远返回窗口的所有者(owner)。对于子窗口,函数返回 NULL,因为它们的父窗口就相当于所有者(注意,是“相当于”)。因为Windows系统没有维护子窗口的所有者信息。 MFC中则是通过如下函数得到所有者窗口指针: _AFXWIN_INLINE CWnd* CWnd::GetOwner() const { return m_hWndOwner != NULL ? CWnd::FromHandle(m_hWndOwner) : GetParent(); } 从上述代码我们可以看出,它返回的值和GetWindow返回的有所区别,如果当前窗口没有owner,那么将返回它的父窗口指针。 但是Windows没有提供改变窗口所有者的方法。MFC中则提供了改变所有者的方法: _AFXWIN_INLINE void CWnd::SetOwner(CWnd* pOwnerWnd) { m_hWndOwner = pOwnerWnd != NULL ? pOwnerWnd->m_hWnd : NULL; } 另外,mfc还提供了CWnd::GetSafeOwner( CWnd* pParent, HWND* pWndTop );函数,可以用来得到参数pParent的第一个非child属性的父窗口指针。如果这个参数是NULL,则返回当前线程的主窗口(通过AfxGetMainWnd得到)。框架经常使用这个函数查找对话框或者属性页的所有者窗口。 如果窗口已经创建, 可以通过::SetWindowLong(hWnd, GWL_HWNDPARENT,(LONG)hWndNewOwner)来改变 不过微软不推介Owner窗口动态改变,因为这样会使窗口层次乱掉。You must not call SetWindowLong with the GWL_HWNDPARENT index to change the parent of a child window. Instead, use the SetParent function. 串口数据解码 如何能够做到按照设置程序自动解码? dll与exe之间的问题 一个高中学历程序员的自传 热烈欢迎vchelp老大江川的到来 list box 如何设置工作区的ResourceView 弱质问题 : 请问如何在客户端(基于View/Document的)处理ActiveX的事件? 基于UDP传输文件 那位老兄发发善心把水晶报表控件如何使用的文章或例子放上来,(要vc调用的) ClientDC.TextOUtW应该显示的文字不能及时显示 对话框控制Document成员变量出错啊 MFC嵌入activex控件(如IE控件)的焦点问题
GetWindow(hWnd, GW_OWNER)永远返回窗口的所有者(owner)。对于子窗口,函数返回 NULL,因为它们的父窗口就相当于所有者(注意,是“相当于”)。因为Windows系统没有维护子窗口的所有者信息。 MFC中则是通过如下函数得到所有者窗口指针:
_AFXWIN_INLINE CWnd* CWnd::GetOwner() const
{ return m_hWndOwner != NULL ? CWnd::FromHandle(m_hWndOwner) : GetParent(); }
从上述代码我们可以看出,它返回的值和GetWindow返回的有所区别,如果当前窗口没有owner,那么将返回它的父窗口指针。 但是Windows没有提供改变窗口所有者的方法。MFC中则提供了改变所有者的方法:
_AFXWIN_INLINE void CWnd::SetOwner(CWnd* pOwnerWnd)
{ m_hWndOwner = pOwnerWnd != NULL ? pOwnerWnd->m_hWnd : NULL; } 另外,mfc还提供了CWnd::GetSafeOwner( CWnd* pParent, HWND* pWndTop );函数,可以用来得到参数pParent的第一个非child属性的父窗口指针。如果这个参数是NULL,则返回当前线程的主窗口(通过AfxGetMainWnd得到)。框架经常使用这个函数查找对话框或者属性页的所有者窗口。
You must not call SetWindowLong with the GWL_HWNDPARENT index to change the parent of a child window. Instead, use the SetParent function.