mirror of
https://github.com/celisej567/source-engine.git
synced 2026-01-05 22:09:59 +03:00
1
This commit is contained in:
94
utils/vmpi/window_anchor_mgr.cpp
Normal file
94
utils/vmpi/window_anchor_mgr.cpp
Normal file
@@ -0,0 +1,94 @@
|
||||
//========= 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 );
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user