In the MainWndProc function, add code to process WM_SIZE messages. This code shows or hides the scrollbars, as needed, and it adjusts the scrollbar ranges and positions.
LRESULT WINAPI MainWndProc (HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
static BOOL fSizeInUse=FALSE; /* Flag to avoid processing multiple WM_SIZE messages */
switch (Message)
{
HANDLE_MSG (hWnd, WM_CREATE, Window_OnCreate);
HANDLE_MSG (hWnd, WM_TIMER, Window_OnTimer);
HANDLE_MSG (hWnd, WM_COMMAND, Window_OnCommand);
HANDLE_MSG (hWnd, WM_PALETTECHANGED, Window_OnPaletteChanged);
HANDLE_MSG (hWnd, WM_QUERYNEWPALETTE, Window_OnQueryNewPalette);
HANDLE_MSG (hWnd, WM_ACTIVATE, Window_OnActivate);
HANDLE_MSG (hWnd, WM_PALETTEISCHANGING, Window_OnPaletteChanging);
HANDLE_MSG (hWnd, WM_SYSCOLORCHANGE, Window_SysColorChange);
HANDLE_MSG (hWnd, WM_PAINT, Window_OnPaint);
HANDLE_MSG (hWnd, WM_DESTROY, Window_OnDestroy);
case WM_SIZE:
/* Avoid processing other WM_SIZE messages while we are processing this one */
if (fSizeInUse == TRUE)
return (0);
fSizeInUse = TRUE;
/* Turn off scrolling and exit if the window is minimized, or
if there is no bitmap */
if ((wParam == SIZE_MINIMIZED) || (!Data.BitmapHandle.Flags.Allocated))
{
SetScrollRange(hWnd, SB_VERT, 0, 0, FALSE);
SetScrollRange(hWnd, SB_HORZ, 0, 0, FALSE);
fSizeInUse = FALSE;
return (0);
}
/* Initialize the client height and width using message parameters */
ClientHeight = HIWORD(lParam);
ClientWidth = LOWORD(lParam);
/* Update the values, separating client information from scrollbar information */
CalcClientMetrics (hWnd,
&ClientWidth,
&ClientHeight,
&RightBarThickness,
&BottomBarThickness);
/* Use the offsets of the display to initialize scroll positions */
XScrollPosition = -rLeadDest.left;
YScrollPosition = -rLeadDest.top;
/* Calculate the range and scroll position of the vertical scroll bar */
if (ClientHeight >= DisplayHeight)
{ /* We do not need a vertical scroll bar */
/* Use the full display height, and turn off the scroll bar */
rLeadDest.bottom = DisplayHeight;
rLeadDest.top = 0;
SetScrollRange(hWnd, SB_VERT, 0, 0, FALSE);
}
else
{ /* We need a vertical scrollbar */
/* The range and position of the vertical scrollbar depend on
whether there is also a horizontal scrollbar */
if (ClientWidth >= DisplayWidth)
{ /* There will not be a horizontal scroll bar */
/* Calculate the range without the horizontal scrollbar */
YScrollRange = DisplayHeight - DisplayWidth;
/* If the expected scroll position would leave blank space,
adjust the scroll position and reposition the display rectangle */
if (YScrollPosition > YScrollRange)
{ /* Reposition the display rectangle */
OffsetRect (&rLeadDest, 0, YScrollPosition - YScrollRange);
/* Adjust the scroll position */
YScrollPosition = YScrollRange;
}
}
else
{ /* There will also be a horizontal scroll bar */
/* Calculate the scroll range, including the scrollbar */
YScrollRange = DisplayHeight - ClientHeight + BottomBarThickness;
}
SetScrollRange(hWnd, SB_VERT, 0, YScrollRange, FALSE);
SetScrollPos(hWnd, SB_VERT, YScrollPosition, TRUE);
}
/* Calculate the range and scroll position of the horizontal scroll bar */
if (ClientWidth >= DisplayWidth)
{ /* We do not need a horizontal scroll bar */
/* Use the full display width, and turn off the scroll bar */
rLeadDest.right = DisplayWidth;
rLeadDest.left = 0;
SetScrollRange(hWnd, SB_HORZ, 0, 0, FALSE);
}
else
{ /* We need a horizontal scrollbar */
/* The range and position of the horizontal scrollbar depend on
whether there is also a vertical scrollbar */
if (ClientHeight >= DisplayHeight)
{ /* There will not be a vertical scroll bar */
/* Calculate the range without the vertical scrollbar */
XScrollRange = DisplayWidth - ClientWidth;
/* If the expected scroll position would leave blank space,
adjust the scroll position and reposition the display rectangle */
if (XScrollPosition > XScrollRange)
{ /* Reposition the display rectangle */
OffsetRect (&rLeadDest, XScrollPosition - XScrollRange, 0);
/* Adjust the scroll position */
XScrollPosition = XScrollRange;
}
}
else
{ /* There will also be a vertical scroll bar */
/* Calculate the scroll range, including the scrollbar */
XScrollRange = DisplayWidth - ClientWidth + RightBarThickness;
}
SetScrollRange(hWnd, SB_HORZ, 0, XScrollRange, FALSE);
SetScrollPos(hWnd, SB_HORZ, XScrollPosition, TRUE);
}
fSizeInUse = FALSE;
return (0);
}
return DefWindowProc (hWnd, Message, wParam, lParam);
}
Help Collections
Raster .NET | C API | C++ Class Library | HTML5 JavaScript
Document .NET | C API | C++ Class Library | HTML5 JavaScript
Medical .NET | C API | C++ Class Library | HTML5 JavaScript
Medical Web Viewer .NET
Multimedia
Direct Show .NET | C API | Filters
Media Foundation .NET | C API | Transforms
Supported Platforms
.NET, Java, Android, and iOS/macOS Assemblies
Imaging, Medical, and Document
C API/C++ Class Libraries
Imaging, Medical, and Document
HTML5 JavaScript Libraries
Imaging, Medical, and Document