API函数GetWindow(hWnd, GW_OWNER)可以得到hWnd的owner窗口, GetParent(hWnd)也可以得到parent或者owner, 但微软怎么不做个SetWindow这样的API函数来真正修改其owner呢?, MFC虽然有SetOwner函数, 但查了一下源码, 发现只是把owner窗口保存起来而已, 并不是像parent/child那样在窗口级别建立了一个链接关系, 郁闷
void CWnd::SetOwner(CWnd* pOwnerWnd)
{
m_hWndOwner = pOwnerWnd != NULL ? pOwnerWnd->m_hWnd : NULL;
}

CWnd* CWnd::GetOwner() const
{
return m_hWndOwner != NULL ? CWnd::FromHandle(m_hWndOwner) : GetParent();
}

再来看看VC2008中的一个隐藏函数, 该函数在MSDN中没有文档支持
HWND AFXAPI AfxGetParentOwner(HWND hWnd)
{
// check for permanent-owned window first
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
if (pWnd != NULL)
return pWnd->GetOwner()->GetSafeHwnd();

// otherwise, return parent in the Windows sense
return (::GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD) ?
::GetParent(hWnd) : ::GetWindow(hWnd, GW_OWNER);
}

C++
2009-01-08 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *