|
|
//+---------------------------------------------------------------------
//
// 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)); }
|