//====== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======= // // Purpose: // //============================================================================= #include "stdafx.h" #include "AnchorMgr.h" static int ProcessAnchorHorz( int originalCoord, int originalParentSize[2], EAnchorHorz eAnchor, int parentWidth, int parentHeight ) { if ( eAnchor == k_eAnchorLeft ) return originalCoord; else return parentWidth - (originalParentSize[0] - originalCoord); } static int ProcessAnchorVert( int originalCoord, int originalParentSize[2], EAnchorVert eAnchor, int parentWidth, int parentHeight ) { if ( eAnchor == k_eAnchorTop ) return originalCoord; else return parentHeight - (originalParentSize[1] - originalCoord); } CAnchorDef::CAnchorDef( int dlgItemID, ESimpleAnchor eSimpleAnchor ) { Init( NULL, dlgItemID, eSimpleAnchor ); } CAnchorDef::CAnchorDef( int dlgItemID, EAnchorHorz eLeftSide, EAnchorVert eTopSide, EAnchorHorz eRightSide, EAnchorVert eBottomSide ) { Init( NULL, dlgItemID, eLeftSide, eTopSide, eRightSide, eBottomSide ); } CAnchorDef::CAnchorDef( HWND hWnd, ESimpleAnchor eSimpleAnchor ) { Init( hWnd, -1, eSimpleAnchor ); } CAnchorDef::CAnchorDef( HWND hWnd, EAnchorHorz eLeftSide, EAnchorVert eTopSide, EAnchorHorz eRightSide, EAnchorVert eBottomSide ) { Init( hWnd, -1, eLeftSide, eTopSide, eRightSide, eBottomSide ); } void CAnchorDef::Init( HWND hWnd, int dlgItemID, ESimpleAnchor eSimpleAnchor ) { if ( eSimpleAnchor == k_eSimpleAnchorBottomRight ) { Init( hWnd, dlgItemID, k_eAnchorRight, k_eAnchorBottom, k_eAnchorRight, k_eAnchorBottom ); } else if ( eSimpleAnchor == k_eSimpleAnchorAllSides ) { Init( hWnd, dlgItemID, k_eAnchorLeft, k_eAnchorTop, k_eAnchorRight, k_eAnchorBottom ); } else if ( eSimpleAnchor == k_eSimpleAnchorStretchRight ) { Init( hWnd, dlgItemID, k_eAnchorLeft, k_eAnchorTop, k_eAnchorRight, k_eAnchorTop ); } else if ( eSimpleAnchor == k_eSimpleAnchorRightSide ) { Init( hWnd, dlgItemID, k_eAnchorRight, k_eAnchorTop, k_eAnchorRight, k_eAnchorTop ); } else if ( eSimpleAnchor == k_eSimpleAnchorBottomSide ) { Init( hWnd, dlgItemID, k_eAnchorLeft, k_eAnchorBottom, k_eAnchorLeft, k_eAnchorBottom ); } } void CAnchorDef::Init( HWND hWnd, int dlgItemID, EAnchorHorz eLeftSide, EAnchorVert eTopSide, EAnchorHorz eRightSide, EAnchorVert eBottomSide ) { m_hInputWnd = hWnd; m_DlgItemID = dlgItemID; m_AnchorLeft = eLeftSide; m_AnchorTop = eTopSide; m_AnchorRight = eRightSide; m_AnchorBottom = eBottomSide; } CAnchorMgr::CAnchorMgr() { } void CAnchorMgr::Init( HWND hParentWnd, CAnchorDef *pAnchors, int nAnchors ) { m_Anchors.CopyArray( pAnchors, nAnchors ); m_hParentWnd = hParentWnd; // Figure out the main window's size. RECT rcParent, rcItem; GetWindowRect( m_hParentWnd, &rcParent ); m_OriginalParentSize[0] = rcParent.right - rcParent.left; m_OriginalParentSize[1] = rcParent.bottom - rcParent.top; // Get all the subitem positions. for ( int i=0; i < m_Anchors.Count(); i++ ) { CAnchorDef *pAnchor = &m_Anchors[i]; if ( pAnchor->m_hInputWnd ) pAnchor->m_hWnd = pAnchor->m_hInputWnd; else pAnchor->m_hWnd = GetDlgItem( m_hParentWnd, pAnchor->m_DlgItemID ); if ( !pAnchor->m_hWnd ) continue; GetWindowRect( pAnchor->m_hWnd, &rcItem ); POINT ptTopLeft; ptTopLeft.x = rcItem.left; ptTopLeft.y = rcItem.top; ScreenToClient( m_hParentWnd, &ptTopLeft ); pAnchor->m_OriginalPos[0] = ptTopLeft.x; pAnchor->m_OriginalPos[1] = ptTopLeft.y; pAnchor->m_OriginalPos[2] = ptTopLeft.x + (rcItem.right - rcItem.left); pAnchor->m_OriginalPos[3] = ptTopLeft.y + (rcItem.bottom - rcItem.top); } } void CAnchorMgr::OnSize() { // Get the new size. int width, height; RECT rcParent; GetWindowRect( m_hParentWnd, &rcParent ); width = rcParent.right - rcParent.left; height = rcParent.bottom - rcParent.top; // Move each item. for ( int i=0; i < m_Anchors.Count(); i++ ) { CAnchorDef *pAnchor = &m_Anchors[i]; if ( !pAnchor->m_hWnd ) continue; RECT rcNew; rcNew.left = ProcessAnchorHorz( pAnchor->m_OriginalPos[0], m_OriginalParentSize, pAnchor->m_AnchorLeft, width, height ); rcNew.right = ProcessAnchorHorz( pAnchor->m_OriginalPos[2], m_OriginalParentSize, pAnchor->m_AnchorRight, width, height ); rcNew.top = ProcessAnchorVert( pAnchor->m_OriginalPos[1], m_OriginalParentSize, pAnchor->m_AnchorTop, width, height ); rcNew.bottom = ProcessAnchorVert( pAnchor->m_OriginalPos[3], m_OriginalParentSize, pAnchor->m_AnchorBottom, width, height ); SetWindowPos( pAnchor->m_hWnd, NULL, rcNew.left, rcNew.top, rcNew.right-rcNew.left, rcNew.bottom-rcNew.top, SWP_NOZORDER ); InvalidateRect( pAnchor->m_hWnd, NULL, false ); } }