reman3/Rayman_X/cpa/tempgrp/ITF/frmbase.cpp

325 lines
8.1 KiB
C++

#include "stdafx.h"
#ifdef ACTIVE_EDITOR
#include "acp_base.h"
#include "direct.h"
#include "itf/CPARes.h"
#include "errint.h"
#include "mmgint.h"
#include "itf/FRMBase.hpp"
#include "itf/FRMBsMn.hpp"
#include "itf/CPAProj.hpp"
IMPLEMENT_DYNCREATE(FRMBase, CFrameWnd)
BEGIN_MESSAGE_MAP(FRMBase, CFrameWnd)
ON_WM_NCLBUTTONDOWN()
ON_WM_SIZE()
ON_WM_NCHITTEST()
ON_WM_GETMINMAXINFO()
END_MESSAGE_MAP()
// Constructor
//------------------------------------------------------------------------
FRMBase::FRMBase(void)
{
m_bAlreadySize = FALSE;
m_cLock = 0;
m_uiHitTest = HTNOWHERE;
m_p_oMainWorld = NULL;
memset(&m_stWinTop, 0, sizeof(tdstFRMLink));
memset(&m_stWinBottom, 0, sizeof(tdstFRMLink));
memset(&m_stWinLeft, 0, sizeof(tdstFRMLink));
memset(&m_stWinRight, 0, sizeof(tdstFRMLink));
m_bKeepPos = TRUE;
m_iInitWidth = 0;
m_iInitHeight = 0;
m_dwCaptionStyle = 0;//WS_CAPTION|WS_MAXIMIZEBOX|WS_MINIMIZEBOX|WS_SYSMENU;
m_oLastPos.SetRectEmpty();
}
// Create frame
//------------------------------------------------------------------------
BOOL FRMBase::CreateBase
(
LPCTSTR lpszWindowName,
int _iCol,
int _iRow,
CPA_MainWorld *_p_oMainWorld,
CCreateContext *pContext
)
{
BOOL bRes;
CFrameWnd *pParentWnd;
DWORD dwStyle;
m_iCol = _iCol;
m_iRow = _iRow;
m_p_oMainWorld = _p_oMainWorld;
// Style of window
if((m_iCol!=2)||(m_iRow!=2))
dwStyle = m_dwCaptionStyle|WS_DISABLED|WS_CLIPCHILDREN|WS_THICKFRAME|/*WS_OVERLAPPED|*/WS_CHILD|WS_CLIPSIBLINGS;
else
dwStyle = m_dwCaptionStyle|WS_DISABLED|WS_CLIPCHILDREN|WS_THICKFRAME;//WS_OVERLAPPED;
// Parent window : The first created one
// pParentWnd = g_oFrameGest.mp_oFirstWindow;
pParentWnd = &g_oBaseFrame;
// Create frame window
bRes = CFrameWnd::Create
(
NULL,
lpszWindowName,
dwStyle,
rectDefault,
pParentWnd,
NULL,
0,
pContext
);
ASSERT(bRes);
// Add frame to list of frames
g_oFrameGest.mfn_vAddOneFrame(this);
return bRes;
}
// To set caption title
//------------------------------------------------------------------------
void FRMBase::mfn_vEnableCaption(BOOL _bVal)
{
if(_bVal)
ModifyStyle(0, WS_CAPTION|m_dwCaptionStyle, WS_VISIBLE);
else
ModifyStyle(WS_CAPTION|m_dwCaptionStyle, 0, WS_VISIBLE);
if(g_oFrameGest.m_iCanRefresh >= 0)
{
RECT stRect;
GetWindowRect(&stRect);
g_oBaseFrame.ScreenToClient(&stRect);
m_oCurPos.left--;
MoveWindow(&stRect);
stRect.left++;
MoveWindow(&stRect);
}
}
//*************************************************************
// MESSAGES
//*************************************************************
// Select window, but not move it
//-------------------------------------------------------------
void FRMBase::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
if(nHitTest == HTCAPTION)
SetFocus();
else
CFrameWnd::OnNcLButtonDown(nHitTest, point);
}
// To test point under mouse
//-------------------------------------------------------------
UINT FRMBase::OnNcHitTest(CPoint point)
{
CSize sizeFrame(GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME));
UINT uiReponse = CFrameWnd::OnNcHitTest(point);
RECT stRect;
GetWindowRect(&stRect);
//
// Where is this ? : No corners
//
switch(uiReponse)
{
case HTTOPLEFT:
if(point.x < stRect.left + sizeFrame.cx)
uiReponse = HTLEFT;
else
uiReponse = HTTOP;
break;
case HTTOPRIGHT:
if(point.x > stRect.right - sizeFrame.cx)
uiReponse = HTRIGHT;
else
uiReponse = HTTOP;
break;
case HTBOTTOMRIGHT:
if(point.x > stRect.right - sizeFrame.cx)
uiReponse = HTRIGHT;
else
uiReponse = HTBOTTOM;
break;
case HTBOTTOMLEFT:
if(point.x < stRect.left + sizeFrame.cx)
uiReponse = HTLEFT;
else
uiReponse = HTBOTTOM;
break;
case HTSIZE:
return HTNOWHERE;
}
m_uiHitTest = uiReponse;
//
// Post process to eventually disable hit test
//
switch(m_uiHitTest)
{
case HTTOP:
case HTBOTTOM:
case HTLEFT:
case HTRIGHT:
if((m_iCol==2)&&(m_iRow==2))
{
if(M_bEditorsActive())
uiReponse = HTNOWHERE;
}
break;
}
switch(m_uiHitTest)
{
case HTTOP:
if(m_cLock & FRM_C_MoveTop)
uiReponse = HTNOWHERE;
break;
case HTBOTTOM:
if(m_cLock & FRM_C_MoveBottom)
uiReponse = HTNOWHERE;
break;
case HTLEFT:
if(m_cLock & FRM_C_MoveLeft)
uiReponse = HTNOWHERE;
break;
case HTRIGHT:
if(m_cLock & FRM_C_MoveRight)
uiReponse = HTNOWHERE;
break;
}
return uiReponse;
}
// When window is resized
//-------------------------------------------------------------
void FRMBase::OnSize(UINT nType, int cx, int cy)
{
char cMove = 0;
switch(m_uiHitTest)
{
case HTTOP:
cMove = FRM_C_MoveTop;
break;
case HTBOTTOM:
cMove = FRM_C_MoveBottom;
break;
case HTLEFT:
cMove = FRM_C_MoveLeft;
break;
case HTRIGHT:
cMove = FRM_C_MoveRight;
break;
}
CFrameWnd::OnSize(nType, cx, cy);
if(cMove && m_bAlreadySize == FALSE)
{
GetWindowRect(m_oCurPos);
g_oBaseFrame.ScreenToClient(m_oCurPos);
g_oFrameGest.m_iBeginSize++;
if(g_oFrameGest.m_iBeginSize == 1)
g_oFrameGest.mfn_vUpdateLastPos();
g_oFrameGest.mfn_vAWindowHasMoved(this, cMove);
g_oFrameGest.m_iBeginSize--;
if(g_oFrameGest.m_iBeginSize == 0)
g_oFrameGest.mfn_vRefreshWindows(FALSE);
}
}
void FRMBase::mfn_vComputeWidthWindow(int nWidth)
{
m_uiHitTest = HTRIGHT;
if(m_cLock & FRM_C_MoveRight)
{
m_uiHitTest = HTLEFT;
if(m_cLock & FRM_C_MoveLeft)
return;
}
if(m_uiHitTest == HTRIGHT)
m_oCurPos.right = m_oCurPos.left + nWidth;
else
m_oCurPos.left = m_oCurPos.right - nWidth;
}
void FRMBase::mfn_vWidthWindow(int nWidth)
{
CRect stPos = m_oCurPos;
mfn_vComputeWidthWindow(nWidth);
if(!stPos.EqualRect(m_oCurPos))
MoveWindow(m_oCurPos.left, m_oCurPos.top, m_oCurPos.right - m_oCurPos.left + 1, m_oCurPos.bottom - m_oCurPos.top + 1);
}
void FRMBase::mfn_vComputeHeightWindow(int nHeight)
{
m_uiHitTest = HTBOTTOM;
if(m_cLock & FRM_C_MoveBottom)
{
m_uiHitTest = HTTOP;
if(m_cLock & FRM_C_MoveTop)
return;
}
if(m_uiHitTest == HTBOTTOM)
m_oCurPos.bottom = m_oCurPos.top + nHeight;
else
m_oCurPos.top = m_oCurPos.bottom - nHeight;
}
void FRMBase::mfn_vHeightWindow(int nHeight)
{
CRect stPos = m_oCurPos;
mfn_vComputeHeightWindow(nHeight);
if(!stPos.EqualRect(m_oCurPos))
MoveWindow(m_oCurPos.left, m_oCurPos.top, m_oCurPos.right - m_oCurPos.left + 1, m_oCurPos.bottom - m_oCurPos.top + 1);
}
void FRMBase::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
CSize sizeScreen(GetSystemMetrics(SM_CXMAXIMIZED), GetSystemMetrics(SM_CYMAXIMIZED));
CSize sizeDlgFrame(GetSystemMetrics(SM_CXDLGFRAME), GetSystemMetrics(SM_CYDLGFRAME));
sizeScreen.cx -= 2*sizeDlgFrame.cx;
sizeScreen.cy -= ((2*sizeDlgFrame.cy)+GetSystemMetrics(SM_CYCAPTION));
lpMMI->ptMinTrackSize.x = 100;
lpMMI->ptMinTrackSize.y = 120;
lpMMI->ptMaxTrackSize.x = sizeScreen.cx - 100;
lpMMI->ptMaxTrackSize.y = sizeScreen.cy - 120;
if((m_cLock & FRM_C_MoveTop) && (m_cLock & FRM_C_MoveBottom))
lpMMI->ptMaxTrackSize.y = sizeScreen.cy;
if((m_cLock & FRM_C_MoveLeft) && (m_cLock & FRM_C_MoveRight))
lpMMI->ptMaxTrackSize.x = sizeScreen.cx;
if(!(m_cLock & FRM_C_MoveTop) && !(m_cLock & FRM_C_MoveBottom))
lpMMI->ptMaxTrackSize.y = sizeScreen.cy;
if(!(m_cLock & FRM_C_MoveLeft) && !(m_cLock & FRM_C_MoveRight))
lpMMI->ptMaxTrackSize.x = sizeScreen.cx;
}
#endif // ACTIVE_EDITOR