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

  • Organizations are increasingly gravitating toward mobile-first application development as they assess the need to revamp their application portfolios to support touch computing and mobility. Consumerization has brought higher expectations for application usability along with the mobile devices themselves. Enterprises are increasingly shifting their new application acquisitions and development efforts toward mobile platforms. With this backdrop, it is natural to expect application platform vendors to invest in …

  • On-demand Event Event Date: July 22, 2015 Today's increasingly mobile workforce creates new challenges for organizations that rely heavily on collaboration. Businesses need to be both secure and collaborative, and they can't sacrifice one over the other. The plethora of devices and clouds used by mobile employees only complicates these challenges. Watch this webcast and learn how your business can enable mobile access to files from anywhere while it helps to maintain information governance, compliance, and …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date