// cdxCDynamicBar.cpp : implementation file // #include "stdafx.h" #include "cdxCDynamicBar.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // cdxCDynamicBarDlg dialog ///////////////////////////////////////////////////////////////////////////// IMPLEMENT_DYNAMIC(cdxCDynamicBarDlg,cdxCDynamicChildDlg); ///////////////////////////////////////////////////////////////////////////// // cdxCDynamicBarDlg dialog ///////////////////////////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP(cdxCDynamicBarDlg, cdxCDynamicChildDlg) ON_WM_CLOSE() END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // cdxCDynamicBarDlg functions ///////////////////////////////////////////////////////////////////////////// bool cdxCDynamicBarDlg::Create(cdxCDynamicBar *pBar) { return cdxCDynamicChildDlg::Create(m_nID,(CWnd *)pBar) != FALSE; } ///////////////////////////////////////////////////////////////////////////// // cdxCDynamicBar ///////////////////////////////////////////////////////////////////////////// IMPLEMENT_DYNAMIC(cdxCDynamicBar,CSizingControlBar); ///////////////////////////////////////////////////////////////////////////// // construction ///////////////////////////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP(cdxCDynamicBar, CSizingControlBar) //{{AFX_MSG_MAP(cdxCDynamicBar) ON_WM_SIZING() ON_WM_SIZE() ON_WM_NCCALCSIZE() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // cdxCDynamicBar message handlers ///////////////////////////////////////////////////////////////////////////// /* * create bar & dialog */ BOOL cdxCDynamicBar::Create(LPCTSTR lpszWindowName, CWnd* pParentWnd, CSize sizeDefault, BOOL bHasGripper, UINT nID, DWORD dwStyle) { if(!( CSizingControlBar::Create( lpszWindowName, pParentWnd, sizeDefault, bHasGripper, nID, dwStyle|WS_CLIPCHILDREN) )) { ASSERT(false); return FALSE; } if(!( m_rDlg.Create(this) )) { DestroyWindow(); ASSERT(false); return FALSE; } ASSERT(::IsWindow(m_hWnd)); ASSERT(m_rDlg.IsWindow()); ASSERT(!m_rectBorder.IsRectNull()); // the following code will even be provided by m_szMin.cx = m_rectBorder.left + m_rectBorder.right; m_szMin.cy = m_rectBorder.top + m_rectBorder.bottom; m_szMin += m_rDlg.m_szMin; return TRUE; } /* * route command UI updates to dialog */ void cdxCDynamicBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler) { CSizingControlBar::OnUpdateCmdUI(pTarget,bDisableIfNoHndler); if(m_rDlg.IsWindow()) m_rDlg.OnUpdateCmdUI(pTarget,bDisableIfNoHndler); } /* * when sizing starts, we'll force the super-duper anti-flickering mode : */ void cdxCDynamicBar::OnSizing(UINT fwSide, LPRECT pRect) { CSizingControlBar::OnSizing(fwSide, pRect); m_rDlg.StartAntiFlickering((fwSide == WMSZ_BOTTOM) || (fwSide == WMSZ_BOTTOMRIGHT) || (fwSide == WMSZ_RIGHT)); } /* * let my dialog cover the entire area */ void cdxCDynamicBar::OnSize(UINT nType, int cx, int cy) { CSizingControlBar::OnSize(nType, cx, cy); if(::IsWindow(m_hWnd) && m_rDlg.IsWindow() && (nType != SIZE_MINIMIZED)) { m_rDlg.SetWindowPos( NULL,0,0,cx,cy, SWP_NOACTIVATE| SWP_NOOWNERZORDER| SWP_NOZORDER); } } /* * OnNcCalcSize() is used to calculate the optimum * min size for the dialog. */ void cdxCDynamicBar::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp) { m_rectBorder = lpncsp->rgrc[0]; // load initial rectangle CSizingControlBar::OnNcCalcSize(bCalcValidRects, lpncsp); ASSERT(m_rectBorder.left <= lpncsp->rgrc[0].left); ASSERT(m_rectBorder.top <= lpncsp->rgrc[0].top); ASSERT(m_rectBorder.right >= lpncsp->rgrc[0].right); ASSERT(m_rectBorder.bottom >= lpncsp->rgrc[0].bottom); m_rectBorder.left = lpncsp->rgrc[0].left - m_rectBorder.left; m_rectBorder.top = lpncsp->rgrc[0].top - m_rectBorder.top; m_rectBorder.right = m_rectBorder.right - lpncsp->rgrc[0].right; m_rectBorder.bottom = m_rectBorder.bottom - lpncsp->rgrc[0].bottom; m_szMin = m_rDlg.m_szMin; m_szMin.cx += m_rectBorder.left + m_rectBorder.right; m_szMin.cy += m_rectBorder.top + m_rectBorder.bottom; } /* * route commands a long... */ BOOL cdxCDynamicBar::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) { if(m_rDlg.IsWindow() && m_rDlg.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE; return CSizingControlBar::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); } /* * route commands ... */ BOOL cdxCDynamicBar::OnCommand(WPARAM wParam, LPARAM lParam) { if(m_rDlg.IsWindow() && m_rDlg.OnCommand(wParam, lParam)) return TRUE; return CSizingControlBar::OnCommand(wParam, lParam); }