server-re/third-party/BugTrap-1.3-57bd515/source/LayoutManager.cpp
2026-10-14 15:54:34 -04:00

160 lines
4.7 KiB
C++

/*
* This is a part of the BugTrap package.
* Copyright (c) 2005-2009 IntelleSoft.
* All rights reserved.
*
* Description: Layout manager class.
* Author: Maksim Pyatkovskiy.
*
* This source code is only intended as a supplement to the
* BugTrap package reference and related electronic documentation
* provided with the product. See these sources for detailed
* information regarding the BugTrap package.
*/
#include "StdAfx.h"
#include "LayoutManager.h"
#include "Globals.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
/**
* @param nCtlID - control ID.
* @param nRatioX1 - left coordinate ratio.
* @param nRatioY1 - top coordinate ratio.
* @param nRatioX2 - right coordinate ratio.
* @param nRatioY2 - bottom coordinate ratio.
*/
LAYOUT_INFO::LAYOUT_INFO(int nCtlID, int nRatioX1, int nRatioY1, int nRatioX2, int nRatioY2)
{
m_nCtlID = nCtlID;
m_nRatioX1 = nRatioX1;
m_nRatioY1 = nRatioY1;
m_nRatioX2 = nRatioX2;
m_nRatioY2 = nRatioY2;
ZeroMemory(&m_rcOriginal, sizeof(m_rcOriginal));
}
/**
* @param hwndParent - parent window handle.
* @param arrLayout - array of control layout info blocks.
* @param nItemCount - number of control layout info blocks.
* @param bAddSizeBox - pass true if size box must be added to the dialog.
*/
void CLayoutManager::InitLayout(HWND hwndParent, LAYOUT_INFO arrLayout[], int nItemCount, bool bAddSizeBox)
{
LONG lStyle = GetWindowLong(hwndParent, GWL_STYLE);
lStyle |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
SetWindowLong(hwndParent, GWL_STYLE, lStyle);
RECT rcWindow;
GetWindowRect(hwndParent, &rcWindow);
m_ptMinWindowSize.x = rcWindow.right - rcWindow.left;
m_ptMinWindowSize.y = rcWindow.bottom - rcWindow.top;
RECT rcClient;
GetClientRect(hwndParent, &rcClient);
m_ptMinClientSize.x = rcClient.right;
m_ptMinClientSize.y = rcClient.bottom;
m_hwndParent = hwndParent;
m_arrLayout = arrLayout;
m_nItemCount = nItemCount;
for (int iPos = 0; iPos < nItemCount; ++iPos)
{
LAYOUT_INFO& rLayoutInfo = arrLayout[iPos];
HWND hwndCtl = GetDlgItem(hwndParent, rLayoutInfo.m_nCtlID);
RECT& rcOriginal = rLayoutInfo.m_rcOriginal;
GetWindowRect(hwndCtl, &rcOriginal);
ScreenToClient(hwndParent, (PPOINT)&rcOriginal);
ScreenToClient(hwndParent, (PPOINT)&rcOriginal + 1);
}
m_hwndSizeBox = bAddSizeBox ?
CreateWindow(WC_SCROLLBAR, NULL, WS_CHILD | WS_VISIBLE | WS_GROUP | SBS_SIZEGRIP | SBS_SIZEBOXBOTTOMRIGHTALIGN | WS_CLIPSIBLINGS,
rcClient.left, rcClient.top, rcClient.right, rcClient.bottom, hwndParent, NULL, g_hInstance, NULL) : NULL;
}
void CLayoutManager::ApplyLayout(void)
{
if (! m_arrLayout)
return;
RECT rcClient;
GetClientRect(m_hwndParent, &rcClient);
const int nWindowDeltaX = rcClient.right - m_ptMinClientSize.x;
const int nWindowDeltaY = rcClient.bottom - m_ptMinClientSize.y;
BOOL bVisible = IsWindowVisible(m_hwndParent);
if (bVisible)
SendMessage(m_hwndParent, WM_SETREDRAW, FALSE, 0);
int iPos;
for (iPos = 0; iPos < m_nItemCount; ++iPos)
{
const LAYOUT_INFO& rLayoutInfo = m_arrLayout[iPos];
const RECT& rcOriginal = rLayoutInfo.m_rcOriginal;
RECT rcCtl;
if (nWindowDeltaX > 0)
{
rcCtl.left = rcOriginal.left + nWindowDeltaX * rLayoutInfo.m_nRatioX1 / ALIGN_RANGE;
rcCtl.right = rcOriginal.right + nWindowDeltaX * rLayoutInfo.m_nRatioX2 / ALIGN_RANGE;
}
else
{
rcCtl.left = rcOriginal.left;
rcCtl.right = rcOriginal.right;
}
if (nWindowDeltaY > 0)
{
rcCtl.top = rcOriginal.top + nWindowDeltaY * rLayoutInfo.m_nRatioY1 / ALIGN_RANGE;
rcCtl.bottom = rcOriginal.bottom + nWindowDeltaY * rLayoutInfo.m_nRatioY2 / ALIGN_RANGE;
}
else
{
rcCtl.top = rcOriginal.top;
rcCtl.bottom = rcOriginal.bottom;
}
int nHorScrollVal = GetScrollPos(m_hwndParent, SB_HORZ);
rcCtl.left -= nHorScrollVal;
rcCtl.right -= nHorScrollVal;
int nVertScrollVal = GetScrollPos(m_hwndParent, SB_VERT);
rcCtl.top -= nVertScrollVal;
rcCtl.bottom -= nVertScrollVal;
HWND hwndCtl = GetDlgItem(m_hwndParent, rLayoutInfo.m_nCtlID);
SetWindowPos(hwndCtl,
NULL,
rcCtl.left,
rcCtl.top,
rcCtl.right - rcCtl.left,
rcCtl.bottom - rcCtl.top,
SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOREDRAW);
}
if (m_hwndSizeBox)
{
RECT rcCtl;
GetWindowRect(m_hwndSizeBox, &rcCtl);
SetWindowPos(m_hwndSizeBox,
NULL,
rcClient.right - (rcCtl.right - rcCtl.left),
rcClient.bottom - (rcCtl.bottom - rcCtl.top),
0,
0,
SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOREDRAW | SWP_NOSIZE);
ShowWindow(m_hwndSizeBox, IsMaximized(m_hwndParent) ? SW_HIDE : SW_SHOW);
}
if (bVisible)
{
SendMessage(m_hwndParent, WM_SETREDRAW, TRUE, 0);
RedrawWindow(m_hwndParent, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN);
}
}