We help IT Professionals succeed at work.

Check out our new AWS podcast with Certified Expert, Phil Phillips! Listen to "How to Execute a Seamless AWS Migration" on EE or on your favorite podcast platform. Listen Now

x

Adding tabs to the MainFrame in an MDI application.

westine
westine asked
on
Medium Priority
595 Views
Last Modified: 2013-11-19
I have an MDI application and would like to add tabs to the MainFrame (the CMDIFrameWnd derived class) so that the child windows are added to the tab control without losing the other MDI functionality (cascade, tile, etc).  This would create a "workbook" feel in the MDI application. The tabs would act just like selcting a child window from the "Window" menu. I've tried changing the window class to "SysTabControl32" in the CREATESTRUCT but have had no luck. Has anyone tried this or have any ideas? I've been told that there are some software packages available that can extend MFC in this manner, unfortunately my funds are very limited.  Thanks for any help.
Comment
Watch Question

Unlock this solution with a free trial preview.
(No credit card required)
Get Preview

Author

Commented:
Hi Andy,  Thanks for the quick response.  Will the other MDI features work the same with this solution?  For instance, if the MDIFrameWnd works like a tab control will selecting Window->Tile from the main menu still tile the child windows within the Frame/TabControl and then selecting a tab would just give the related child window focus (likewise, when the child windows are maximized, selecting a tab will display that child window)?  If so, this sounds a solution I can use. Also, I would appreciate any help with the resizeable property sheet...  Thanks, Jim
What I would do is to create a FormView that has no contorls on it and add a ResizePropertySheet as a member that get created in the OnInit override.  Then also overide the ONSize to resize it to fill the form.  This keep the Doc-view architecture.
following is the code for a resize Property Sheet.  You may not need all of it as it also modify style etc to make it have resize boder which you will not require.
// ResizePropertySheet.cpp : implementation file
//
 
#include "stdafx.h"
#include "ResizePropertySheet.h"
 
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
 
#define  TOP_OFFSET   (30)
#define  LEFT_OFFSET   (10)
#define  BOTTOM_OFFSET  (8)
#define  RIGHT_OFFSET  (8)
 
/////////////////////////////////////////////////////////////////////////////
// CResizePropertySheet
 
IMPLEMENT_DYNAMIC(CResizePropertySheet, CPropertySheet)
 
CResizePropertySheet::CResizePropertySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
 :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
}
 
CResizePropertySheet::CResizePropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
 :CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
}
 
CResizePropertySheet::~CResizePropertySheet()
{
}
 

BEGIN_MESSAGE_MAP(CResizePropertySheet, CPropertySheet)
 //{{AFX_MSG_MAP(CResizePropertySheet)
 ON_WM_SIZE()
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()
 
/////////////////////////////////////////////////////////////////////////////
// CResizePropertySheet message handlers
 

void CResizePropertySheet::PreSubclassWindow()
{
 ModifyStyle ( 0, WS_SIZEBOX);
 CPropertySheet::PreSubclassWindow();
}
 
void CResizePropertySheet::OnSize(UINT nType, int cx, int cy)
{
 CPropertySheet::OnSize(nType, cx, cy);
 
 CRect   WinRect;
 CRect   TabWinRect;
 CTabCtrl  *pTabCtrl;
 CPropertyPage *pPage;
 unsigned int a,ct;
 
 GetWindowRect( &WinRect );
 pTabCtrl = GetTabControl();
 if(NULL != pTabCtrl)
 {
  WinRect.top += TOP_OFFSET;
  WinRect.left += LEFT_OFFSET;
  WinRect.right -= RIGHT_OFFSET;
  WinRect.bottom -= BOTTOM_OFFSET;
  ScreenToClient( &WinRect );
  pTabCtrl->MoveWindow( &WinRect );
  pTabCtrl->AdjustRect( FALSE, &WinRect );
 
  ct = m_pages.GetSize();
  for(a = 0; a < ct; a++)
  {
   pPage = (CPropertyPage*)m_pages[a];
   if( NULL != pPage->m_hWnd )
   {
    pPage->MoveWindow( &WinRect );
    //pPage->SendMessage( WM_SIZE, SIZE_RESTORED, MAKELONG( WinRect.Width(), WinRect.Height() ) );
   }
  }
 }
}
 

void CResizePropertySheet::HideAllButtons()
{
 unsigned int idButtons[] = {IDOK,IDCANCEL,ID_APPLY_NOW,ID_WIZBACK,ID_WIZNEXT,ID_WIZFINISH};
 

 CWnd   *pWnd;
 unsigned int  a,ct;
 

 ct = sizeof(idButtons) / sizeof(idButtons[0]);
 for(a = 0; a < ct ; a++)
 {
  pWnd = GetDlgItem( idButtons[a] ) ;
  if( NULL != pWnd )
  {
   pWnd->ShowWindow( FALSE );
  }
 }
}
 
BOOL CResizePropertySheet::OnInitDialog()
{
 BOOL bResult = CPropertySheet::OnInitDialog();
 CTabCtrl   *pTabCtrl;
 CRect    WinRect;
 
 HideAllButtons();
 GetWindowRect( &WinRect );
 pTabCtrl = GetTabControl();
 if( NULL != pTabCtrl )
 {
  WinRect.top += TOP_OFFSET;
  WinRect.left += LEFT_OFFSET;
  WinRect.right -= RIGHT_OFFSET;
  WinRect.bottom -= BOTTOM_OFFSET;
  ScreenToClient( &WinRect );
  pTabCtrl->MoveWindow( &WinRect );
 }
 return bResult;
}

Author

Commented:
Thanks Andy!  I'll give this a shot and see if it does the trick.

Author

Commented:
Thanks Andy...
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a free trial preview!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.