113 lines
2.6 KiB
C++
113 lines
2.6 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1997.
|
|
//
|
|
// File: W I N D U T I L . C P P
|
|
//
|
|
// Contents: Window utilities -- For now, just CenterWindow
|
|
//
|
|
// Notes:
|
|
//
|
|
// Author: jeffspr 22 May 1998
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "pch.h"
|
|
#pragma hdrstop
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: FCenterWindow
|
|
//
|
|
// Purpose: Center a child window on the parent
|
|
//
|
|
// Arguments:
|
|
// hwndChild [in] Child window handle
|
|
// hwndParent [in] Parent window handle (or NULL for desktop)
|
|
//
|
|
// Returns:
|
|
//
|
|
// Author: jeffspr 22 May 1998
|
|
//
|
|
// Notes:
|
|
//
|
|
BOOL FCenterWindow (HWND hwndChild, HWND hwndParent)
|
|
{
|
|
RECT rChild, rParent;
|
|
int wChild, hChild, wParent, hParent;
|
|
int wScreen, hScreen, xNew, yNew;
|
|
HDC hdc = NULL;
|
|
BOOL fReturn = TRUE;
|
|
|
|
AssertSz(hwndChild, "Bad Child Window param to CenterWindow");
|
|
|
|
// Get the Height and Width of the child window
|
|
//
|
|
GetWindowRect (hwndChild, &rChild);
|
|
wChild = rChild.right - rChild.left;
|
|
hChild = rChild.bottom - rChild.top;
|
|
|
|
// Get the Height and Width of the parent window
|
|
//
|
|
if (NULL == hwndParent)
|
|
{
|
|
GetWindowRect (GetDesktopWindow(), &rParent);
|
|
}
|
|
else
|
|
{
|
|
GetWindowRect (hwndParent, &rParent);
|
|
}
|
|
|
|
wParent = rParent.right - rParent.left;
|
|
hParent = rParent.bottom - rParent.top;
|
|
|
|
// Get the display limits
|
|
//
|
|
hdc = GetDC (hwndChild);
|
|
if (hdc)
|
|
{
|
|
wScreen = GetDeviceCaps (hdc, HORZRES);
|
|
hScreen = GetDeviceCaps (hdc, VERTRES);
|
|
ReleaseDC (hwndChild, hdc);
|
|
|
|
// Calculate new X position, then adjust for screen
|
|
//
|
|
xNew = rParent.left + ((wParent - wChild) / 2);
|
|
if (xNew < 0)
|
|
{
|
|
xNew = 0;
|
|
}
|
|
else if ((xNew + wChild) > wScreen)
|
|
{
|
|
xNew = wScreen - wChild;
|
|
}
|
|
|
|
// Calculate new Y position, then adjust for screen
|
|
//
|
|
yNew = rParent.top + ((hParent - hChild) / 2);
|
|
if (yNew < 0)
|
|
{
|
|
yNew = 0;
|
|
}
|
|
else if ((yNew + hChild) > hScreen)
|
|
{
|
|
yNew = hScreen - hChild;
|
|
}
|
|
|
|
// Set it, and return
|
|
//
|
|
fReturn = SetWindowPos (hwndChild, NULL,
|
|
xNew, yNew, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
|
|
}
|
|
else
|
|
{
|
|
fReturn = FALSE;
|
|
}
|
|
|
|
return fReturn;
|
|
}
|
|
|