Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

104 lines
3.3 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1999
//
// File: Resizer.cxx
//
// Contents: Implementation of the CResizer class
//
// Written by Joe Porkka
//
//----------------------------------------------------------------------------
#include "headers.hxx"
#include "Resizer.h"
CResizer::CResizer()
: _hWnd(0), _pResizeInfo(0)
{
memset(&_winRect, 0, sizeof(_winRect));
}
void CResizer::Init(HWND win, CResizeInfo *pResizeInfo)
{
_hWnd = win;
_pResizeInfo = pResizeInfo;
GetClientRect(_hWnd, &_winRect);
for(CResizeInfo *p = _pResizeInfo; p->_id; ++p)
{
InitCtrl(p);
}
}
CResizer::~CResizer()
{
}
void CResizer::NewSize() const
{
RECT newDlgSize;
GetClientRect(_hWnd, &newDlgSize);
for(CResizeInfo *p = _pResizeInfo; p->_id; ++p)
{
RECT newpos = p->_Rect;
if (p->_Flags & sf_Width)
{ // Adjust the width
int w = (p->_Rect.right - p->_Rect.left) + (newDlgSize.right - _winRect.right);
newpos.right = newpos.left + w;
}
if (p->_Flags & sf_Height)
{ // Adjust the height
int h = (p->_Rect.bottom - p->_Rect.top) + (newDlgSize.bottom - _winRect.bottom);
newpos.bottom = newpos.top + h;
}
if (p->_Flags & sf_Left)
{ // adjust left edge
int w = p->_Rect.right - p->_Rect.left;
newpos.left = newDlgSize.right - (_winRect.right - p->_Rect.left);
newpos.right = newpos.left + w;
}
if (p->_Flags & sf_Top)
{ // adjust top edge
int h = p->_Rect.bottom - p->_Rect.top;
newpos.top = newDlgSize.bottom - (_winRect.bottom - p->_Rect.top);
newpos.bottom = newpos.top + h;
}
if (p->_Flags & sf_HalfLeftWidth)
{ // adjust left edge & width by half width delta
// int w = p->_Rect.right - p->_Rect.left;
int widthdelta = newDlgSize.right - _winRect.right;
newpos.left = p->_Rect.left + widthdelta / 2;
newpos.right = p->_Rect.right + widthdelta;
}
if (p->_Flags & sf_HalfTopHeight)
{ // adjust left edge & width by half width delta
int heightdelta = newDlgSize.bottom - _winRect.bottom;
newpos.top = p->_Rect.top + heightdelta / 2;
newpos.bottom = p->_Rect.bottom + heightdelta;
}
if (p->_Flags & sf_HalfWidth)
{ // adjust left edge & width by half width delta
int widthdelta = newDlgSize.right - _winRect.right;
newpos.right = p->_Rect.right + widthdelta - widthdelta / 2;
}
if (p->_Flags & sf_HalfHeight)
{ // adjust left edge & width by half width delta
int heightdelta = newDlgSize.bottom - _winRect.bottom;
newpos.bottom = p->_Rect.bottom + heightdelta - heightdelta / 2;
}
SetWindowPos(GetDlgItem(_hWnd, p->_id), 0, newpos.left, newpos.top, newpos.right - newpos.left, newpos.bottom - newpos.top, SWP_NOZORDER);
}
}
void CResizer::InitCtrl(CResizeInfo *p)
{
GetWindowRect(GetDlgItem(_hWnd, p->_id), &p->_Rect);
MapWindowPoints(0, _hWnd, (POINT *)&p->_Rect, 2); // Map abs coordinates of control to dialog relative.
}