You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
314 lines
7.3 KiB
C++
314 lines
7.3 KiB
C++
2 years ago
|
// XTPControlCustom.cpp : implementation of the CXTPControlCustom class.
|
||
|
//
|
||
|
// This file is a part of the XTREME COMMANDBARS MFC class library.
|
||
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
||
|
//
|
||
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
||
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
||
|
// CONSENT OF CODEJOCK SOFTWARE.
|
||
|
//
|
||
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
||
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
||
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
||
|
// SINGLE COMPUTER.
|
||
|
//
|
||
|
// CONTACT INFORMATION:
|
||
|
// support@codejock.com
|
||
|
// http://www.codejock.com
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "Common/XTPDrawHelpers.h"
|
||
|
#include "Common/XTPPropExchange.h"
|
||
|
#include "Common/XTPHookManager.h"
|
||
|
#include "Common/XTPSystemHelpers.h"
|
||
|
|
||
|
#include "XTPCommandBarsDefines.h"
|
||
|
#include "XTPControl.h"
|
||
|
#include "XTPControlButton.h"
|
||
|
#include "XTPControls.h"
|
||
|
#include "XTPCommandBar.h"
|
||
|
#include "XTPToolBar.h"
|
||
|
#include "XTPCommandBars.h"
|
||
|
#include "XTPControlCustom.h"
|
||
|
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
////////////////////////////
|
||
|
|
||
|
|
||
|
IMPLEMENT_XTP_CONTROL(CXTPControlCustom, CXTPControlButton)
|
||
|
|
||
|
|
||
|
CXTPControlCustom::CXTPControlCustom()
|
||
|
{
|
||
|
m_hwndControl = NULL;
|
||
|
m_rcBorders.SetRectEmpty();
|
||
|
m_verticalOptions = xtpVerticalHide;
|
||
|
m_bControlVisible = TRUE;
|
||
|
m_dwFlags = xtpFlagNoMovable;
|
||
|
m_nControlID = 0;
|
||
|
|
||
|
EnableAutomation();
|
||
|
}
|
||
|
|
||
|
CXTPControlCustom::~CXTPControlCustom()
|
||
|
{
|
||
|
XTPHookManager()->RemoveAll(this);
|
||
|
}
|
||
|
|
||
|
void CXTPControlCustom::SetControl(CWnd* pWnd)
|
||
|
{
|
||
|
XTPHookManager()->RemoveAll(this);
|
||
|
|
||
|
m_hwndControl = pWnd->GetSafeHwnd();
|
||
|
|
||
|
if (m_hwndControl)
|
||
|
{
|
||
|
XTPHookManager()->SetHook(m_hwndControl, this);
|
||
|
|
||
|
CXTPWindowRect rc(m_hwndControl);
|
||
|
m_szControl = CSize(rc.Width(), rc.Height());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int CXTPControlCustom::OnHookMessage(HWND hWnd, UINT nMessage, WPARAM& wParam, LPARAM& lParam, LRESULT& /*lResult*/)
|
||
|
{
|
||
|
if (nMessage == WM_MOUSEMOVE)
|
||
|
{
|
||
|
CPoint point(lParam);
|
||
|
MapWindowPoints(hWnd, m_pParent->GetSafeHwnd(), &point, 1);
|
||
|
GetParent()->OnMouseMove((UINT)wParam, point);
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
void CXTPControlCustom::SetSize(CSize szControl)
|
||
|
{
|
||
|
m_szControl = szControl;
|
||
|
}
|
||
|
|
||
|
CWnd* CXTPControlCustom::GetControl()
|
||
|
{
|
||
|
return CWnd::FromHandle(m_hwndControl);
|
||
|
}
|
||
|
|
||
|
|
||
|
CSize CXTPControlCustom::GetSize(CDC* pDC)
|
||
|
{
|
||
|
if (m_hwndControl && m_bControlVisible)
|
||
|
{
|
||
|
return CSize(m_szControl.cx + m_rcBorders.left + m_rcBorders.right, m_szControl.cy + m_rcBorders.top + m_rcBorders.bottom);
|
||
|
|
||
|
}
|
||
|
return CXTPControlButton::GetSize(pDC);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CXTPControlCustom::SetRect(CRect rcControl)
|
||
|
{
|
||
|
if (m_rcControl == rcControl && !(m_hwndControl && ::GetParent(m_hwndControl) != m_pParent->GetSafeHwnd()))
|
||
|
return;
|
||
|
|
||
|
m_rcControl = rcControl;
|
||
|
|
||
|
CWnd* pControlWnd = CWnd::FromHandle(m_hwndControl);
|
||
|
if (pControlWnd && pControlWnd->GetSafeHwnd() && ::IsWindow(pControlWnd->GetSafeHwnd()))
|
||
|
{
|
||
|
pControlWnd->SetParent(m_pParent);
|
||
|
pControlWnd->ModifyStyle(WS_POPUP, WS_CHILD);
|
||
|
rcControl.DeflateRect(m_rcBorders);
|
||
|
pControlWnd->MoveWindow(rcControl);
|
||
|
|
||
|
ShowHideChildControl();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPControlCustom::OnEnabledChanged()
|
||
|
{
|
||
|
if (m_hwndControl)
|
||
|
{
|
||
|
::EnableWindow(m_hwndControl, GetEnabled());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPControlCustom::ShowHideChildControl()
|
||
|
{
|
||
|
if (m_pControls && m_pControls->IsOriginalControls())
|
||
|
return;
|
||
|
|
||
|
if (!m_pParent || (::GetParent(m_hwndControl) != m_pParent->GetSafeHwnd()))
|
||
|
return;
|
||
|
|
||
|
if (m_hwndControl)
|
||
|
{
|
||
|
::SetWindowPos(m_hwndControl, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE
|
||
|
| (m_pParent && m_bControlVisible && IsVisible() && m_pParent->GetSafeHwnd() ? SWP_SHOWWINDOW : SWP_HIDEWINDOW));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPControlCustom::OnRemoved()
|
||
|
{
|
||
|
m_bControlVisible = FALSE;
|
||
|
ShowHideChildControl();
|
||
|
|
||
|
CXTPControlButton::OnRemoved();
|
||
|
}
|
||
|
|
||
|
void CXTPControlCustom::SetHideFlags(DWORD dwFlags)
|
||
|
{
|
||
|
if (m_dwHideFlags != dwFlags)
|
||
|
{
|
||
|
m_dwHideFlags = dwFlags;
|
||
|
|
||
|
ShowHideChildControl();
|
||
|
DelayLayoutParent();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPControlCustom::OnActionChanged(int nProperty)
|
||
|
{
|
||
|
CXTPControl::OnActionChanged(nProperty);
|
||
|
|
||
|
if (nProperty == 2 && m_hwndControl)
|
||
|
{
|
||
|
ShowHideChildControl();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPControlCustom::OnCalcDynamicSize(DWORD dwMode)
|
||
|
{
|
||
|
if (m_verticalOptions == xtpVerticalHide)
|
||
|
{
|
||
|
if (dwMode & LM_VERTDOCK) SetHideFlags(m_dwHideFlags | xtpHideDockingPosition);
|
||
|
else SetHideFlags(m_dwHideFlags & ~xtpHideDockingPosition);
|
||
|
}
|
||
|
if (m_verticalOptions == xtpVerticalButton)
|
||
|
{
|
||
|
m_bControlVisible = (dwMode & LM_VERTDOCK) == 0;
|
||
|
ShowHideChildControl();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPControlCustom::Copy(CXTPControl* pControl, BOOL bRecursive)
|
||
|
{
|
||
|
ASSERT(DYNAMIC_DOWNCAST(CXTPControlCustom, pControl));
|
||
|
|
||
|
m_rcBorders = ((CXTPControlCustom*)pControl)->m_rcBorders;
|
||
|
m_verticalOptions = ((CXTPControlCustom*)pControl)->m_verticalOptions;
|
||
|
m_szControl = ((CXTPControlCustom*)pControl)->m_szControl;
|
||
|
m_hwndControl = ((CXTPControlCustom*)pControl)->m_hwndControl;
|
||
|
m_nControlID = ((CXTPControlCustom*)pControl)->m_nControlID;
|
||
|
|
||
|
CXTPControl::Copy(pControl, bRecursive);
|
||
|
}
|
||
|
|
||
|
BOOL CXTPControlCustom::IsCustomizeDragOverAvail(CXTPCommandBar* pCommandBar, CPoint /*point*/, DROPEFFECT& dropEffect)
|
||
|
{
|
||
|
if (pCommandBar->GetType() != xtpBarTypePopup)
|
||
|
{
|
||
|
dropEffect = DROPEFFECT_NONE;
|
||
|
return FALSE;
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
void CXTPControlCustom::Draw(CDC* pDC)
|
||
|
{
|
||
|
if (m_hwndControl && ::IsWindowVisible(m_hwndControl))
|
||
|
return;
|
||
|
|
||
|
CXTPControlButton::Draw(pDC);
|
||
|
}
|
||
|
|
||
|
void CXTPControlCustom::OnClick(BOOL bKeyboard, CPoint pt)
|
||
|
{
|
||
|
if (m_hwndControl && ::IsWindowVisible(m_hwndControl) && !IsCustomizeMode())
|
||
|
return;
|
||
|
|
||
|
CXTPControlButton::OnClick(bKeyboard, pt);
|
||
|
}
|
||
|
|
||
|
void CXTPControlCustom::SetBorders(int cxRight, int cxTop, int cxLeft, int cxBottom)
|
||
|
{
|
||
|
m_rcBorders.SetRect(cxRight, cxTop, cxLeft, cxBottom);
|
||
|
}
|
||
|
|
||
|
void CXTPControlCustom::SetVerticalPositionOption(XTPControlCustomVerticalOptions options)
|
||
|
{
|
||
|
m_verticalOptions = options;
|
||
|
}
|
||
|
|
||
|
CWnd* CXTPControlCustom::FindChildWindow(CXTPCommandBars* pCommandBars, UINT nID)
|
||
|
{
|
||
|
CWnd* pWndSite = pCommandBars->GetSite();
|
||
|
|
||
|
if (pWndSite->GetDlgItem(nID) != NULL)
|
||
|
return pWndSite->GetDlgItem(nID);
|
||
|
|
||
|
for (int i = 0; i < pCommandBars->GetCount(); i++)
|
||
|
{
|
||
|
CXTPToolBar* pToolBar = pCommandBars->GetAt(i);
|
||
|
|
||
|
if (pToolBar->GetDlgItem(nID) != NULL)
|
||
|
return pToolBar->GetDlgItem(nID);
|
||
|
}
|
||
|
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
void CXTPControlCustom::DoPropExchange(CXTPPropExchange* pPX)
|
||
|
{
|
||
|
CXTPControlButton::DoPropExchange(pPX);
|
||
|
|
||
|
PX_Rect(pPX, _T("Borders"), m_rcBorders, CRect(0, 0, 0, 0));
|
||
|
PX_Size(pPX, _T("ControlSize"), m_szControl, CSize(0, 0));
|
||
|
PX_Enum(pPX, _T("VerticalOptions"), m_verticalOptions, xtpVerticalHide);
|
||
|
|
||
|
if (pPX->GetSchema() > _XTP_SCHEMA_861)
|
||
|
{
|
||
|
PX_Int(pPX, _T("ControlId"), m_nControlID, 0);
|
||
|
}
|
||
|
|
||
|
if (pPX->IsLoading() && m_nControlID != 0)
|
||
|
{
|
||
|
CXTPCommandBars* pCommandBars = ((XTP_COMMANDBARS_PROPEXCHANGE_PARAM*)pPX->m_dwData)->pCommandBars;
|
||
|
ASSERT(pCommandBars->IsKindOf(RUNTIME_CLASS(CXTPCommandBars)));
|
||
|
ASSERT(pCommandBars && pCommandBars->GetSite());
|
||
|
|
||
|
CWnd* pWnd = FindChildWindow(pCommandBars, m_nControlID);
|
||
|
|
||
|
if (pWnd)
|
||
|
{
|
||
|
m_hwndControl = pWnd->GetSafeHwnd();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
CXTPControlCustom* CXTPControlCustom::CreateControlCustom(CWnd* pWndChild)
|
||
|
{
|
||
|
CXTPControlCustom* pControlCustom = (CXTPControlCustom*)CreateObject();
|
||
|
pControlCustom->SetControl(pWndChild);
|
||
|
pControlCustom->m_nControlID = pWndChild->GetDlgCtrlID();
|
||
|
|
||
|
return pControlCustom;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|