www.pudn.com > vc开发的精美界面.zip > BCGDialogBar.cpp
//******************************************************************************* // 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. // // For the latest updates to this library, check my site: // http://welcome.to/bcgsoft // // Stas Levin//******************************************************************************* // BCGDialogBar.cpp : implementation file // #include "stdafx.h" #include <../src/occimpl.h> #include "bcgcontrolbar.h" #include "globals.h" #include "BCGDialogBar.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CBCGDialogBar IMPLEMENT_SERIAL(CBCGDialogBar, CBCGSizingControlBar, VERSIONABLE_SCHEMA | 1) CBCGDialogBar::CBCGDialogBar() { m_bAllowSizing = FALSE; #ifndef _AFX_NO_OCC_SUPPORT m_lpszTemplateName = NULL; m_pOccDialogInfo = NULL; #endif } CBCGDialogBar::~CBCGDialogBar() { // DestroyWindow(); // avoid PostNcDestroy problems } ///////////////////////////////////////////////////////////////////////////// // 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 //---------------------------- // initialize common controls //---------------------------- VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG)); AfxDeferRegisterClass(AFX_WNDCOMMCTLSNEW_REG); //-------------------------- // create a modeless dialog //-------------------------- if (!CreateDlg (lpszTemplateName, pParentWnd)) { TRACE(_T("Can't create diaog: %s\n"), lpszTemplateName); return FALSE; } #ifndef _AFX_NO_OCC_SUPPORT m_lpszTemplateName = NULL; #endif 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); if (lpszWindowName != NULL) { SetWindowText (lpszWindowName); } return TRUE; } //**************************************************************************************** void CBCGDialogBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler) { UpdateDialogControls(pTarget, bDisableIfNoHndler); } #ifndef _AFX_NO_OCC_SUPPORT BEGIN_MESSAGE_MAP(CBCGDialogBar, CBCGSizingControlBar) //{{AFX_MSG_MAP(CBCGDialogBar) ON_WM_ERASEBKGND() //}}AFX_MSG_MAP ON_MESSAGE(WM_INITDIALOG, HandleInitDialog) END_MESSAGE_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)) { TRACE (_T("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 BOOL CBCGDialogBar::OnEraseBkgnd(CDC* pDC) { CRect rectClient; GetClientRect (rectClient); pDC->FillRect (rectClient, &globalData.brBtnFace); return TRUE; }