134 lines
4 KiB
C++
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));
|
||
|
}
|
||
|
|