95 lines
2.8 KiB
C++
95 lines
2.8 KiB
C++
//========= 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 );
|
|
}
|
|
}
|
|
|