2025-11-27 16:46:48 +09:00

243 lines
6.8 KiB
C++

// ===================================================================================
// Class Implementation : COXMDIFloatWnd
// ===================================================================================
// Header file : OXMDIFloatWnd.cpp
// Version: 9.3
// This software along with its related components, documentation and files ("The Libraries")
// is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
// governed by a software license agreement ("Agreement"). Copies of the Agreement are
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
// to obtain this file, or directly from our office. For a copy of the license governing
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
// Some portions Copyright (C)1994-5 Micro Focus Inc, 2465 East Bayshore Rd, Palo Alto, CA 94303.
// //////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <afxpriv.h>
#ifndef __OXMFCIMPL_H__
#if _MFC_VER >= 0x0700
#if _MFC_VER >= 1400
#include <afxtempl.h>
#endif
#include <..\src\mfc\afximpl.h>
#else
#include <..\src\afximpl.h>
#endif
#define __OXMFCIMPL_H__
#endif
#include "OXMDIFloatWnd.h"
#include "OXSizeDockBar.h"
#include "OXSizeCtrlBar.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
// Helper function: used below
void AdjustForBorders(CRect& rect, DWORD dwStyle);
/////////////////////////////////////////////////////////////////////////////
// Definition of static members
// Data members -------------------------------------------------------------
// protected:
// private:
// Member functions ---------------------------------------------------------
// public:
IMPLEMENT_DYNCREATE(COXMDIFloatWnd, CMDIFloat_Parent)
COXMDIFloatWnd::COXMDIFloatWnd()
: m_wndMDIDockBar(TRUE)
{
m_wndMDIDockBar.m_bAutoDelete = FALSE;
}
COXMDIFloatWnd::~COXMDIFloatWnd()
{
}
BEGIN_MESSAGE_MAP(COXMDIFloatWnd, CMDIFloat_Parent)
//{{AFX_MSG_MAP(COXMDIFloatWnd)
ON_WM_SIZE()
ON_WM_SHOWWINDOW()
ON_WM_CLOSE()
ON_WM_WINDOWPOSCHANGED()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COXMDIFloatWnd message handlers
BOOL COXMDIFloatWnd::Create(CWnd* pParent, DWORD dwBarStyle)
{
// set m_bInRecalcLayout to avoid flashing during creation
// RecalcLayout will be called once something is docked
m_bInRecalcLayout = TRUE;
static CString strFloatClass;
if (strFloatClass.IsEmpty())
strFloatClass = AfxRegisterWndClass(CS_DBLCLKS);
DWORD dwStyle = WS_CLIPCHILDREN | WS_CHILD | WS_OVERLAPPEDWINDOW | FWS_SNAPTOBARS;
if (!CMDIFloat_Parent::Create(strFloatClass, NULL, dwStyle, rectDefault, NULL /*(CMDIFrameWnd *)pParent)*/))
{
m_bInRecalcLayout = FALSE;
return FALSE;
}
// Create a single dockbar for this frame with ID=AFX_IDW_DOCKBAR_FLOAT (picked up later)
dwStyle = dwBarStyle & (CBRS_ALIGN_LEFT|CBRS_ALIGN_RIGHT) ? CBRS_ALIGN_LEFT : CBRS_ALIGN_TOP;
dwStyle |= dwBarStyle & CBRS_FLOAT_MULTI;
if (!m_wndMDIDockBar.Create(pParent, WS_CHILD | WS_VISIBLE | dwStyle, AFX_IDW_DOCKBAR_FLOAT))
{
m_bInRecalcLayout = FALSE;
return FALSE;
}
m_wndMDIDockBar.SetParent(this);
m_bInRecalcLayout = FALSE;
return TRUE;
}
BOOL COXMDIFloatWnd::PreCreateWindow(CREATESTRUCT& cs)
{
// Turn off the WS_EX_CLIENTEDGE style on the Frame.
if (!CMDIFloat_Parent::PreCreateWindow(cs))
return FALSE;
cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
return TRUE;
}
// respond to the miniframe resizing. If we've got a sizeable control
// bar in the window, then we set it's size. Need to adjust for the
// window borders. The window will then get repositioned by a ReCalcLayout()
void COXMDIFloatWnd::OnSize(UINT nType, int cx, int cy)
{
if (cx == 0 && cy == 0)
return;
CDockBar* pDock = &m_wndMDIDockBar;
// We don't support CBRS_FLOAT_MULTI
if ((pDock->m_dwStyle & CBRS_FLOAT_MULTI) == 0)
{
// CMiniDockFrameWnd class assumes if there is only 1 bar, then it's at position 1
// in the array
COXSizeControlBar* pBar = ((COXSizeDockBar*)pDock)->GetFirstControlBar();
// ignore size request if not visible....
if (pBar != NULL && COXSizeDockBar::IsSizeable(pBar) && pBar->IsVisible())
{
CRect rect(0, 0, cx, cy);
AdjustForBorders(rect, pBar->m_dwStyle);
pBar->m_FloatSize.cx = rect.Width();
pBar->m_FloatSize.cy = rect.Height();
}
}
CMDIFloat_Parent::OnSize(nType, cx, cy); // call parent to update menu's etc.
}
void COXMDIFloatWnd::OnClose()
{
CControlBar* pBar = NULL;
CDockBar* pDock = &m_wndMDIDockBar;
if ((pDock->m_dwStyle & CBRS_FLOAT_MULTI) == 0)
{
// CMiniDockFrameWnd class assumes if there is only 1 bar, then it's at position 1
// in the array
pBar = ((COXSizeDockBar*) pDock)->GetFirstControlBar();
if (pBar != NULL && pBar->IsKindOf(RUNTIME_CLASS(COXSizeControlBar)) )
if (((COXSizeControlBar*)pBar)->m_Style & SZBARF_DESTROY_ON_CLOSE)
{
// close the Frame Window
CMDIFloat_Parent::OnClose(); // close the window
delete pBar; // now explicitly delete the control bar
return;
}
}
// otherwise just close it. .. really just want to hide it...
((COXSizeControlBar*)pBar)->OnHide();
}
void COXMDIFloatWnd::RecalcLayout(BOOL bNotify)
{
if (!m_bInRecalcLayout)
{
CMDIFloat_Parent::RecalcLayout(bNotify);
// syncronize window text of frame window with dockbar itself
CString strTitle;
m_wndMDIDockBar.GetWindowText(strTitle);
AfxSetWindowText(m_hWnd, strTitle);
}
}
// Updates the floating position for a bar.
void COXMDIFloatWnd::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
{
CMDIFloat_Parent::OnWindowPosChanged(lpwndpos);
if ((m_wndMDIDockBar.m_dwStyle & CBRS_FLOAT_MULTI) == 0)
{
COXSizeControlBar* pBar = ((COXSizeDockBar*) &m_wndMDIDockBar)->GetFirstControlBar();
if (pBar != NULL)
{
ASSERT(pBar->m_pDockContext != NULL);
CRect rcWindow;
GetWindowRect(rcWindow);
pBar->m_pDockContext->m_ptMRUFloatPos = rcWindow.TopLeft();
}
}
}
void COXMDIFloatWnd::ShowControlBar(CControlBar* pBar, BOOL bShow, BOOL bDelay)
{
CMDIFloat_Parent::ShowControlBar(pBar, bShow, bDelay);
}
void COXMDIFloatWnd::OnShowWindow(BOOL bShow, UINT nStatus)
{
if (nStatus == 0 && bShow == TRUE)
SetWindowPos(&wndTop, 0, 0, 0, 0,
SWP_NOSIZE|SWP_NOMOVE);
CMDIFloat_Parent::OnShowWindow(bShow, nStatus);
}
void COXMDIFloatWnd::OnAddContextMenuItems(HMENU hMenu)
{
// do nothing, override the default implementation that adds "Dock Window" item
UNREFERENCED_PARAMETER(hMenu);
}
void COXMDIFloatWnd::OnAddSystemMenuItems(CMenu* pSysMenu)
{
// do nothing, override the default implementation that adds "Dock Window" item
UNREFERENCED_PARAMETER(pSysMenu);
}