www.pudn.com > editpad_src > bcgdialogbar.cpp, change:1999-11-22,size:6413b


//******************************************************************************* 
// COPYRIGHT NOTES 
// --------------- 
// This source code is a part of BCGControlBar library. 
// You may use, compile or redistribute it as part of your application  
// for free. You cannot redistribute it as a part of a software development  
// library without the agreement of the author. If the sources are  
// distributed along with the application, you should leave the original  
// copyright notes in the source code without any changes. 
// This code can be used WITHOUT ANY WARRANTIES on your own risk. 
//  
// Stas Levin <stas@iet.co.il> 
//******************************************************************************* 
 
// BCGDialogBar.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "bcgcontrolbar.h" 
#include "BCGDialogBar.h" 
#include <../src/occimpl.h> 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CBCGDialogBar 
 
IMPLEMENT_SERIAL(CBCGDialogBar, CBCGSizingControlBar, VERSIONABLE_SCHEMA | 1) 
 
#pragma warning (disable : 4355) 
 
CBCGDialogBar::CBCGDialogBar() 
{ 
	m_bAllowSizing = FALSE; 
 
#ifndef _AFX_NO_OCC_SUPPORT 
	m_lpszTemplateName = NULL; 
	m_pOccDialogInfo = NULL; 
#endif 
} 
 
CBCGDialogBar::~CBCGDialogBar() 
{ 
//	DestroyWindow();    // avoid PostNcDestroy problems 
} 
 
#pragma warning (default : 4355) 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CBCGDialogBar message handlers 
 
//**************************************************************************************** 
CSize CBCGDialogBar::CalcDynamicLayout(int nLength, DWORD dwMode) 
{ 
	if(m_bAllowSizing) 
	{ 
		return CBCGSizingControlBar::CalcDynamicLayout(nLength, dwMode); 
	} 
	else 
	{ 
		return CControlBar::CalcDynamicLayout(nLength, dwMode); 
	} 
} 
//**************************************************************************************** 
CSize CBCGDialogBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz) 
{ 
	if(m_bAllowSizing) 
	{ 
		return CBCGSizingControlBar::CalcFixedLayout(bStretch, bHorz); 
	} 
	else 
	{ 
		CSize sizeResult = m_sizeDefault; 
 
		if (bStretch) // if not docked stretch to fit 
		{ 
			if (bHorz) 
			{ 
				sizeResult.cx = 32767; 
			} 
			else 
			{ 
				sizeResult.cy = 32767; 
			} 
		} 
 
		//BLOCK: Adjust Margins 
		{ 
			CRect rect; rect.SetRectEmpty(); 
			CalcInsideRect(rect, bHorz); 
			sizeResult.cy -= rect.Height(); 
			sizeResult.cx -= rect.Width(); 
 
			CSize size = CControlBar::CalcFixedLayout (bStretch, bHorz); 
			sizeResult.cx = max(sizeResult.cx, size.cx); 
			sizeResult.cy = max(sizeResult.cy, size.cy); 
		} 
 
		return sizeResult; 
 
	} 
} 
//**************************************************************************************** 
BOOL CBCGDialogBar::Create(LPCTSTR lpszWindowName, CWnd* pParentWnd, BOOL bHasGripper,  
						   UINT nIDTemplate, UINT nStyle, UINT nID) 
{  
	return Create(lpszWindowName, pParentWnd, bHasGripper, MAKEINTRESOURCE(nIDTemplate), nStyle, nID);  
} 
//**************************************************************************************** 
BOOL CBCGDialogBar::Create(LPCTSTR lpszWindowName, CWnd* pParentWnd, BOOL bHasGripper,  
						   LPCTSTR lpszTemplateName, UINT nStyle, UINT nID) 
{ 
	ASSERT(pParentWnd != NULL); 
	ASSERT(lpszTemplateName != NULL); 
 
 
    // cannot be both fixed and dynamic 
    // (CBRS_SIZE_DYNAMIC is used for resizng when floating) 
    ASSERT (!((nStyle & CBRS_SIZE_FIXED) && 
              (nStyle & CBRS_SIZE_DYNAMIC))); 
 
    m_cyGripper = bHasGripper ? 12 : 0; // set the gripper width 
	m_bAllowSizing = nStyle & CBRS_SIZE_DYNAMIC ? TRUE : FALSE; 
 
	// allow chance to modify styles 
	m_dwStyle = (nStyle & CBRS_ALL); 
 
	CREATESTRUCT cs; 
	memset(&cs, 0, sizeof(cs)); 
	cs.lpszClass = AFX_WNDCONTROLBAR; 
	cs.lpszName = lpszWindowName; 
	cs.style = (DWORD)nStyle | WS_CHILD; 
	cs.hMenu = (HMENU)nID; 
	cs.hInstance = AfxGetInstanceHandle(); 
	cs.hwndParent = pParentWnd->GetSafeHwnd(); 
	if (!PreCreateWindow(cs)) 
		return FALSE; 
 
#ifndef _AFX_NO_OCC_SUPPORT 
	m_lpszTemplateName = lpszTemplateName; 
#endif 
 
	// create a modeless dialog 
 
	// initialize common controls 
	VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG)); 
	AfxDeferRegisterClass(AFX_WNDCOMMCTLSNEW_REG); 
 
	BOOL bSuccess = CreateDlg(lpszTemplateName, pParentWnd); 
 
#ifndef _AFX_NO_OCC_SUPPORT 
	m_lpszTemplateName = NULL; 
#endif 
 
	if (!bSuccess) 
		return FALSE; 
 
 
    SetClassLong(m_hWnd, GCL_HBRBACKGROUND, (LPARAM)::GetSysColorBrush(COLOR_BTNFACE)); 
 
 
    SetBarStyle (GetBarStyle() | CBRS_SIZE_DYNAMIC); 
 
	// dialog template MUST specify that the dialog 
	//  is an invisible child window 
	SetDlgCtrlID(nID); 
	CRect rect; 
	GetWindowRect(&rect); 
	m_sizeDefault = rect.Size();    // set fixed size 
 
    m_szHorz = m_sizeDefault; // set the size members 
    m_szVert = m_sizeDefault; 
    m_szFloat = m_sizeDefault; 
 
	// force WS_CLIPSIBLINGS 
	ModifyStyle(0, WS_CLIPSIBLINGS); 
 
	if (!ExecuteDlgInit(lpszTemplateName)) 
		return FALSE; 
 
 
	// force the size to zero - resizing bar will occur later 
	SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOZORDER|SWP_NOACTIVATE|SWP_SHOWWINDOW); 
 
	return TRUE; 
} 
//**************************************************************************************** 
void CBCGDialogBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler) 
{ 
	UpdateDialogControls(pTarget, bDisableIfNoHndler); 
} 
 
#ifndef _AFX_NO_OCC_SUPPORT 
 
//{{AFX_MSG_MAP(CBCGDialogBar) 
BEGIN_MESSAGE_MAP(CBCGDialogBar, CBCGSizingControlBar) 
	ON_MESSAGE(WM_INITDIALOG, HandleInitDialog) 
END_MESSAGE_MAP() 
//}}AFX_MSG_MAP 
 
LRESULT CBCGDialogBar::HandleInitDialog(WPARAM, LPARAM) 
{ 
	Default();  // allow default to initialize first (common dialogs/etc) 
 
	// create OLE controls 
	COccManager* pOccManager = afxOccManager; 
	if ((pOccManager != NULL) && (m_pOccDialogInfo != NULL)) 
	{ 
		if (!pOccManager->CreateDlgControls(this, m_lpszTemplateName, 
			m_pOccDialogInfo)) 
		{ 
			TRACE0("Warning: CreateDlgControls failed during dialog bar init.\n"); 
			return FALSE; 
		} 
	} 
 
	return TRUE; 
} 
 
BOOL CBCGDialogBar::SetOccDialogInfo(_AFX_OCC_DIALOG_INFO* pOccDialogInfo) 
{ 
	m_pOccDialogInfo = pOccDialogInfo; 
	return TRUE; 
} 
 
#endif //!_AFX_NO_OCC_SUPPORT