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.

207 lines
4.9 KiB
C++

2 years ago
// XTPSkinObjectMDI.cpp: implementation of the CXTPSkinObjectMDI class.
//
// This file is a part of the XTREME SKINFRAMEWORK 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 "XTPSkinObject.h"
#include "XTPSkinObjectFrame.h"
#include "XTPSkinObjectMDI.h"
#include "XTPSkinManager.h"
#define MM_CALCSCROLL 0x003F
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CXTPSkinObjectMDIClient, CXTPSkinObjectFrame)
CXTPSkinObjectMDIClient::CXTPSkinObjectMDIClient()
{
m_bMDIClient = TRUE;
m_bArrange = FALSE;
m_pMDIParent = NULL;
m_bSetWindowProc = TRUE;
}
CXTPSkinObjectMDIClient::~CXTPSkinObjectMDIClient()
{
}
BEGIN_MESSAGE_MAP(CXTPSkinObjectMDIClient, CXTPSkinObjectFrame)
//{{AFX_MSG_MAP(CXTPSkinObjectButton)
ON_WM_VSCROLL()
ON_WM_HSCROLL()
ON_MESSAGE(MM_CALCSCROLL, OnCalcScroll)
ON_WM_NCACTIVATE()
ON_WM_SIZE()
ON_MESSAGE_VOID(WM_MDIICONARRANGE, OnMDIArrange)
ON_MESSAGE_VOID(WM_MDICASCADE, OnMDIArrange)
ON_MESSAGE_VOID(WM_MDITILE, OnMDIArrange)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CXTPSkinObjectMDIClient::OnHookAttached(LPCREATESTRUCT lpcs, BOOL bAuto)
{
CXTPSkinObjectFrame* pParent = (CXTPSkinObjectFrame*)GetSkinManager()->Lookup(lpcs->hwndParent);
if (pParent)
{
m_pMDIParent = pParent;
m_pMDIParent->m_pMDIClient = this;
m_pMDIParent->InternalAddRef();
}
CXTPSkinObjectFrame::OnHookAttached(lpcs, bAuto);
}
void CXTPSkinObjectMDIClient::OnHookDetached(BOOL bAuto)
{
if (m_pMDIParent)
{
m_pMDIParent->m_pMDIClient = NULL;
m_pMDIParent->InternalRelease();
m_pMDIParent = NULL;
}
CXTPSkinObjectFrame::OnHookDetached(bAuto);
}
BOOL CXTPSkinObjectMDIClient::IsDefWindowProcAvail(int nMessage) const
{
return (UINT)nMessage == m_nMsgQuerySkinState;
}
void CXTPSkinObjectMDIClient::OnHScroll(UINT /*nSBCode*/, UINT /*nPos*/, CScrollBar* /*pScrollBar*/)
{
Default();
RedrawScrollBar(SB_HORZ);
}
void CXTPSkinObjectMDIClient::OnVScroll(UINT /*nSBCode*/, UINT /*nPos*/, CScrollBar* /*pScrollBar*/)
{
Default();
RedrawScrollBar(SB_VERT);
}
LRESULT CXTPSkinObjectMDIClient::OnCalcScroll(WPARAM, LPARAM)
{
LRESULT lResult = Default();
RedrawScrollBar(SB_VERT);
RedrawScrollBar(SB_HORZ);
return lResult;
}
BOOL CXTPSkinObjectMDIClient::OnNcActivate(BOOL bActive)
{
BOOL bResult = CXTPSkinObjectFrame::OnNcActivate(bActive);
RedrawScrollBar(SB_VERT);
RedrawScrollBar(SB_HORZ);
return bResult;
}
void CXTPSkinObjectMDIClient::OnSize(UINT nType, int cx, int cy)
{
if (((m_pManager->GetApplyOptions() & (xtpSkinApplyMetrics | xtpSkinApplyFrame)) == (xtpSkinApplyMetrics | xtpSkinApplyFrame)))
{
HWND hwndActive = (HWND)SendMessage(WM_MDIGETACTIVE);
if (hwndActive && ::GetWindowLongPtr(hwndActive, GWL_STYLE) & WS_MAXIMIZE)
{
CXTPSkinObjectFrame* pFrame = (CXTPSkinObjectFrame*)m_pManager->Lookup(hwndActive);
if (pFrame && pFrame->IsSkinEnabled())
{
CRect rcBorders = pFrame->GetBorders();
RECT rc;
rc.left = -rcBorders.left;
rc.top = -rcBorders.top;
rc.right = cx + rcBorders.right;
rc.bottom = cy + rcBorders.bottom;
::MoveWindow(hwndActive, rc.left, rc.top,
rc.right - rc.left, rc.bottom - rc.top, TRUE);
return;
}
}
}
CXTPSkinObjectFrame::OnSize(nType, cx, cy);
}
void CXTPSkinObjectMDIClient::OnMDIArrange()
{
if (m_bArrange)
{
Default();
return;
}
else
{
m_bArrange = TRUE;
HWND hWnd = ::GetWindow(m_hWnd, GW_CHILD);
while (hWnd)
{
CXTPSkinObjectFrame* pFrame = (CXTPSkinObjectFrame*)m_pManager->Lookup(hWnd);
if (pFrame)
{
RECT rc = CXTPWindowRect(hWnd);
pFrame->m_bLockFrameDraw += 1;
pFrame->SendMessage(WM_NCCALCSIZE, FALSE, (LPARAM)&rc);
pFrame->m_bLockFrameDraw -= 1;
pFrame->SetTimer(XTP_TID_REFRESHFRAME, 1000, &CXTPSkinObjectFrame::OnTimerInternal);
}
hWnd = ::GetWindow(hWnd, GW_HWNDNEXT);
}
Default();
m_bArrange = FALSE;
hWnd = ::GetWindow(m_hWnd, GW_CHILD);
while (hWnd)
{
CXTPSkinObjectFrame* pFrame = (CXTPSkinObjectFrame*)m_pManager->Lookup(hWnd);
if (pFrame)
{
pFrame->RedrawFrame();
}
hWnd = ::GetWindow(hWnd, GW_HWNDNEXT);
}
}
}