Implementing Scrollbars: Step 6

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 Version 21.0.2023.2.15
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2021 LEAD Technologies, Inc. All Rights Reserved.

LEADTOOLS Raster Imaging C API Help
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2021 LEAD Technologies, Inc. All Rights Reserved.