Adding tabs to the MainFrame in an MDI application.

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.
westineAsked:
Who is Participating?
 
Andy_KeysConnect With a Mentor Commented:
the best way I've found is to write a resizeable prortertysheet so and use that to determine the size then resize each page to match it.  You can then trap the WM_Size in each page and resize the contols etc.  If you need help with the resizeable property sheet let me know.
0
 
westineAuthor 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
0
 
Andy_KeysCommented:
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;
}

0
 
westineAuthor Commented:
Thanks Andy!  I'll give this a shot and see if it does the trick.
0
 
westineAuthor Commented:
Thanks Andy...
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.