windows-nt/Source/XPSP1/NT/multimedia/media/sndrec32/o2base/wutils.cxx
2020-09-26 16:20:57 +08:00

134 lines
4 KiB
C++

//+---------------------------------------------------------------------
//
// File: wutils.cxx
//
// Contents: Windows helper functions
//
//----------------------------------------------------------------------
#include "headers.hxx"
#pragma hdrstop
//+---------------------------------------------------------------
//
// Function: LoadResourceData
//
// Synopsis: Loads a resource RCDATA block into a buffer
//
// Arguments: [hinst] -- instance of the module with the resource
// [lpstrId] -- the identifier of the RCDATA resource
// [lpvBuf] -- the buffer where the resource is to be loaded
// [cbBuf] -- the number of bytes of resource data to load
//
// Returns: lpvBuf if the resource was successfully loaded, NULL otherwise
//
// Notes: This function combines Windows' FindResource, LoadResource,
// LockResource, and a memory copy.
//
//----------------------------------------------------------------
LPVOID
LoadResourceData(HINSTANCE hinst,
LPCTSTR lpstrId,
LPVOID lpvBuf,
int cbBuf)
{
LPVOID lpvRet = NULL;
HRSRC hrsrc = FindResource(hinst, lpstrId, RT_RCDATA);
if (hrsrc != NULL)
{
HGLOBAL hgbl = LoadResource(hinst, hrsrc);
if (hgbl != NULL)
{
LPVOID lpvSrc = LockResource(hgbl);
if (lpvSrc != NULL)
{
lpvRet = _fmemcpy(lpvBuf, lpvSrc, cbBuf);
UnlockResource(hgbl);
}
FreeResource(hgbl);
}
}
return lpvRet;
}
//+---------------------------------------------------------------
//
// Function: GetChildWindowRect
//
// Synopsis: Gets the rectangle of the child window in
// its parent window coordinates
//
// Arguments: [hwndChild] -- the child window
// [lprect] -- the rectangle to fill with childs coordinates
//
// Notes: This function gets the screen coordinates of the child
// then maps them into the client coordinates of its parent.
//
//----------------------------------------------------------------
void
GetChildWindowRect(HWND hwndChild, LPRECT lprect)
{
HWND hwndParent;
POINT ptUpperLeft;
POINT ptLowerRight;
// get the screen coordinates of the child window
GetWindowRect(hwndChild, lprect);
// get the parent window of the child
if ((hwndParent = GetParent(hwndChild)) != NULL)
{
// map the screen coordinates to client coordinates
ptUpperLeft.x = lprect->left;
ptUpperLeft.y = lprect->top;
ptLowerRight.x = lprect->right;
ptLowerRight.y = lprect->bottom;
ScreenToClient(hwndParent, &ptUpperLeft);
ScreenToClient(hwndParent, &ptLowerRight);
SetRect(lprect,
ptUpperLeft.x,
ptUpperLeft.y,
ptLowerRight.x,
ptLowerRight.y);
}
}
//+---------------------------------------------------------------
//
// Function: SizeClientRect
//
// Synopsis: Resizes the window so its client size is a specified
// area. Can also move the window so its client region
// covers a specified rectangle.
//
// Arguments: [hwnd] -- the window to resize/move
// [rc] -- rectangle indicating size and possibly position of
// client area
// [fMove] -- flag indicating resize-only or move
//
// Notes: This function uses SetWindowPos which does not handle
// accurately the case where the menu wraps to more than one line
// as a result of the resize.
//
//----------------------------------------------------------------
void
SizeClientRect(HWND hwnd, RECT& rc, BOOL fMove)
{
AdjustWindowRect(&rc,
GetWindowLong(hwnd, GWL_STYLE),
GetMenu(hwnd) != NULL);
SetWindowPos(hwnd,
NULL,
rc.left,
rc.top,
rc.right-rc.left,
rc.bottom-rc.top,
SWP_NOZORDER|SWP_NOACTIVATE | (fMove ? 0 : SWP_NOMOVE));
}