325 lines
8.1 KiB
C++
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
|