Implementing Scrollbars: Step 3
At the end of the EZFUNC.C file, add the new local function, CalcClientMetrics, which interprets the WM_SIZE message's client area parameters.
/*---[CalcClientMetrics]-------------------------------------------------------
Parameters: HWND hWnd Window handle
int *nClientWidth Width in and width out
int *nClientHeight Height in and height out
int *nRightBarThickness Resulting thickness of the Y scrollbar
int *nBottomBarThickness Resulting thickness of the X scrollbar
ProtoType: EZFunc.h
Notes: Use this function to interpret the client area width and
height parameters from the WM_SIZE message. The incoming
parameters attempt to give us the correct client area, excluding
scrollbars. But, because while processing this message we
show or hide the scrollbars, the incoming parameters often are
not correct. Therefore, we must get the true client area
dimensions, including scrollbars, and get the thickness of
scrollbars. The caller can then make its own decisions about
the size of the client area.
--------------------------------------------------------------------------*/
void CalcClientMetrics (HWND hWnd,
int *nClientWidth,
int *nClientHeight,
int *nRightBarThickness,
int *nBottomBarThickness)
{
DWORD dwStyle, dwVersion;
int cxClient, cyClient, cxScroll, cyScroll;
/* Initialize local variables */
cxClient = *nClientWidth;
cyClient = *nClientHeight;
cxScroll = GetSystemMetrics(SM_CXVSCROLL);
cyScroll = GetSystemMetrics(SM_CYHSCROLL);
dwStyle = GetWindowLong(hWnd, GWL_STYLE);
/* Adjust for the difference in how newer WIN32 versions report
scrollbar thickness when there is a window border */
#ifdef WIN32
{
dwVersion = GetVersion();
if (LOBYTE(LOWORD(dwVersion)) >= 4)
{
cxScroll += GetSystemMetrics(SM_CXBORDER);
cyScroll += GetSystemMetrics(SM_CYBORDER);
}
}
#endif
/* If there is a window border, subtract it from the scrollbar thickness */
if (dwStyle & WS_BORDER)
{
cxScroll -= GetSystemMetrics(SM_CXBORDER);
cyScroll -= GetSystemMetrics(SM_CYBORDER);
}
/* Add the scrollbar thickness to the client area */
if (dwStyle & WS_VSCROLL)
cxClient += cxScroll;
if (dwStyle & WS_HSCROLL)
cyClient += cyScroll;
/* Update the caller's variables */
*nClientWidth = cxClient;
*nClientHeight = cyClient;
*nRightBarThickness = cxScroll;
*nBottomBarThickness = cyScroll;
}