//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "stdafx.h" #include "window_anchor_mgr.h" // ------------------------------------------------------------------------------------ // // CWindowAnchor. // ------------------------------------------------------------------------------------ // bool CWindowAnchor::Init( CWnd *pParentWnd, CWnd *pChildWnd, int aLeft, int aTop, int aRight, int aBottom ) { m_pWnd = pChildWnd; m_aLeft = aLeft; m_aTop = aTop; m_aRight = aRight; m_aBottom = aBottom; if ( m_pWnd && pParentWnd ) { pParentWnd->GetWindowRect( m_ParentRect ); pChildWnd->GetWindowRect( m_Rect ); return true; } else { return false; } } void AnchorElement( long *pOut, CRect &rcParent, int startElement, CRect &rcParentStart, int flags ) { if ( flags == ANCHOR_LEFT ) *pOut = rcParent.left + ( startElement - rcParentStart.left ); else if ( flags == ANCHOR_TOP ) *pOut = rcParent.top + ( startElement - rcParentStart.top ); else if ( flags == ANCHOR_RIGHT ) *pOut = rcParent.right - ( rcParentStart.right - startElement ); else if ( flags == ANCHOR_BOTTOM ) *pOut = rcParent.bottom - ( rcParentStart.bottom - startElement ); else if ( flags == ANCHOR_WIDTH_PERCENT ) *pOut = rcParent.left + (rcParent.Width() * ( startElement - rcParentStart.left )) / rcParentStart.Width(); else if ( flags == ANCHOR_HEIGHT_PERCENT ) *pOut = rcParent.top + (rcParent.Height() * ( startElement - rcParentStart.top )) / rcParentStart.Height(); } void CWindowAnchor::Update( CWnd *pParentWnd ) { if ( !m_pWnd ) return; CRect rcParent; pParentWnd->GetWindowRect( rcParent ); CRect rcNew; AnchorElement( &rcNew.left, rcParent, m_Rect.left, m_ParentRect, m_aLeft ); AnchorElement( &rcNew.top, rcParent, m_Rect.top, m_ParentRect, m_aTop ); AnchorElement( &rcNew.right, rcParent, m_Rect.right, m_ParentRect, m_aRight ); AnchorElement( &rcNew.bottom, rcParent, m_Rect.bottom, m_ParentRect, m_aBottom ); pParentWnd->ScreenToClient( rcNew ); m_pWnd->SetWindowPos( NULL, rcNew.left, rcNew.top, rcNew.Width(), rcNew.Height(), SWP_NOZORDER ); m_pWnd->InvalidateRect( NULL ); } // ------------------------------------------------------------------------------------ // // CWindowAnchorMgr. // ------------------------------------------------------------------------------------ // bool CWindowAnchorMgr::AddAnchor( CWnd *pParentWnd, CWnd *pChildWnd, int aLeft, int aTop, int aRight, int aBottom ) { int index = m_Anchors.AddToTail(); return m_Anchors[index].Init( pParentWnd, pChildWnd, aLeft, aTop, aRight, aBottom ); } void CWindowAnchorMgr::UpdateAnchors( CWnd *pParentWnd ) { FOR_EACH_LL( m_Anchors, i ) { m_Anchors[i].Update( pParentWnd ); } }