Code to View/Hide Status Bar in SDI and MDI Applications

Ever wanted to change the "View/Hide Status Bar" menue option so that the application (main) window changes it's height accordingly preserving the size of the visible client area?

Here's a little handler for the OnViewStatusBar message handler to perform this task. Versions for MFC or Non-MFC available.

//
// OnViewStatusBar handler
//
// increase or decrease app window height to adapt to
// visible or invisible status bar
//

void CMainFrame::OnViewStatusBar() // MFC version
// by Volker Bartheld 

{
 CControlBar* pBar = GetControlBar(AFX_IDW_STATUS_BAR);

 if (pBar != NULL)
 {
  RECT AppWinRect, BarRect;

  GetWindowRect(&AppWinRect);
  pBar->GetWindowRect(&BarRect);
  int iBarHeight = BarRect.bottom - BarRect.top;

  BOOL bShow = (pBar->GetStyle() & WS_VISIBLE) == 0;
  ShowControlBar(pBar, bShow, FALSE);
  if (bShow)
  {
   //    ... increase frame
   SetWindowPos(&CWnd::wndNoTopMost,
   AppWinRect.top, AppWinRect.left,
   AppWinRect.right-AppWinRect.left, AppWinRect.bottom-AppWinRect.top+iBarHeight,
   SWP_NOMOVE);
  }
  else
  {
   //    ... decrease frame
   SetWindowPos(&CWnd::wndNoTopMost,
   AppWinRect.top, AppWinRect.left,
   AppWinRect.right-AppWinRect.left, AppWinRect.bottom-AppWinRect.top-iBarHeight,
   SWP_NOMOVE);
  }
 }
}

void CMainFrame::OnViewStatusBar()  // non-MFC-version
// by Alexander Sailer 

{
 // MFC StatusbarHandler aufrufen
 OnBarCheck(ID_VIEW_STATUS_BAR);

 CControlBar* pBar = NULL;
 BOOL bVisible(false);
 RECT AppWinRect, BarRect;
 int iBarHeight(0);

 // get ptr to status bar
 pBar = GetControlBar(ID_VIEW_STATUS_BAR);
 ASSERT(pBar);

 // Abme_ungen holen
 GetWindowRect(&AppWinRect);
 pBar->GetWindowRect(&BarRect);
 iBarHeight = BarRect.bottom - BarRect.top;

 // Abfrage ob Bar sichtbar ist
 bVisible = pBar->IsVisible();

 if (bVisible)//    ... increase frame
 {    
  SetWindowPos(&CWnd::wndNoTopMost,
  AppWinRect.top, AppWinRect.left,
  AppWinRect.right-AppWinRect.left,
  AppWinRect.bottom-AppWinRect.top+iBarHeight,
  SWP_NOMOVE);
 }
 else //    ... decrease frame
 {    
  SetWindowPos(&CWnd::wndNoTopMost,
  AppWinRect.top, AppWinRect.left,
  AppWinRect.right-AppWinRect.left,
  AppWinRect.bottom-AppWinRect.top-iBarHeight,
  SWP_NOMOVE);
 }
}

Downloads

Download source - 1 Kb


Comments

  • Why not just use CFrameWnd::ShowControBar???

    Posted by Legacy on 03/26/2002 12:00am

    Originally posted by: CodeGuy

    The framework will automatically adjust the size of the client area for you:

    CControlBar* pStatusBar = GetControlBar(AFX_IDW_STATUS_BAR);
    ASSERT_VALID(pStatusBar);

    ShowControlBar(pStatusBar, FALSE, FALSE);

    Could save yourself several lines of code ;).

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • This paper introduces IBM Java on the IBM PowerLinux 7R2 server and describes IBM's implementation of the Java platform, which includes IBM's Java Virtual Machine and development toolkit.

  • Not all enterprise applications are created equal. Sophisticated applications need developer support but other more basic apps do not. With the right tools, everyone is a potential app developer with ideas and a perspective to share. Trends such as low-code development and model driven development are fundamentally changing how and who creates applications. Is your organization ready? Read this report and learn: The seven personas of enterprise app delivery How application ownership is spreading to the …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds