今天看了MFC的实现,它的setowner()方法就是将Cwnd类中的一个成员变量m_hWndOwner改变一下就OK了,用API怎么做?

解决方案 »

  1.   

    http://topic.csdn.net/t/20040915/19/3376260.html
      

  2.   

    API方面好像没有提供这样的函数,好像只提供了GetWindow可以获取窗口的所有者。
      

  3.   

    是啊,不知道MFC是怎样实现这个的!
      

  4.   

    API和MFC本来就不是一回事,怎么能互相代替?
      

  5.   

    http://blog.chinaunix.net/u/28371/showart_400527.html
      

  6.   

    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得到)。框架经常使用这个函数查找对话框或者属性页的所有者窗口。
      

  7.   

    如果窗口已经创建, 可以通过::SetWindowLong(hWnd, GWL_HWNDPARENT,(LONG)hWndNewOwner)来改变
      

  8.   

    不过微软不推介Owner窗口动态改变,因为这样会使窗口层次乱掉。
    You must not call SetWindowLong with the GWL_HWNDPARENT index to change the parent of a child window. Instead, use the SetParent function.