Solved

Adding tabs to the MainFrame in an MDI application.

Posted on 1998-08-04
5
544 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.
0
Comment
Question by:westine
  • 3
  • 2
5 Comments
 
LVL 1

Accepted Solution

by:
Andy_Keys earned 100 total points
Comment Utility
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
 

Author Comment

by:westine
Comment Utility
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
 
LVL 1

Expert Comment

by:Andy_Keys
Comment Utility
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
 

Author Comment

by:westine
Comment Utility
Thanks Andy!  I'll give this a shot and see if it does the trick.
0
 

Author Comment

by:westine
Comment Utility
Thanks Andy...
0

Featured Post

Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

Join & Write a Comment

In this article, I'll describe -- and show pictures of -- some of the significant additions that have been made available to programmers in the MFC Feature Pack for Visual C++ 2008.  These same feature are in the MFC libraries that come with Visual …
Introduction: Dynamic window placements and drawing on a form, simple usage of windows registry as a storage place for information. Continuing from the first article about sudoku.  There we have designed the application and put a lot of user int…
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
This video demonstrates how to create an example email signature rule for a department in a company using CodeTwo Exchange Rules. The signature will be inserted beneath users' latest emails in conversations and will be displayed in users' Sent Items…

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now