Serious-Engine/Sources/Modeler/DlgInfoFrame.cpp

171 lines
5.6 KiB
C++
Raw Normal View History

2016-03-12 01:20:51 +01:00
/* Copyright (c) 2002-2012 Croteam Ltd.
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as published by
the Free Software Foundation
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
2016-03-11 14:57:17 +01:00
// DlgFrameSheet.cpp : implementation file
//
#include "stdafx.h"
#ifdef _DEBUG
#undef new
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDlgInfoFrame
CDlgInfoFrame::CDlgInfoFrame()
{
m_pInfoSheet = NULL;
}
CDlgInfoFrame::~CDlgInfoFrame()
{
// there is no need to destroy or delete sheet object m_pInfoSheet because
// it is created as child window and will be automatically deleted trough its
// PostNcDestroy() and DestroyWindow() member functions. (second one will be called
// by its parent and will end with "delete this;"
}
BEGIN_MESSAGE_MAP(CDlgInfoFrame, CMiniFrameWnd)
//{{AFX_MSG_MAP(CDlgInfoFrame)
ON_WM_CREATE()
ON_WM_CLOSE()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgInfoFrame message handlers
int CDlgInfoFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMiniFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
CMainFrame* pMainFrame = STATIC_DOWNCAST(CMainFrame, AfxGetMainWnd());
// create sheet object to hold numerous pages
m_pInfoSheet = new CDlgInfoSheet(this);
// if creation fails, delete allocated object
if (!m_pInfoSheet->Create(this, WS_CHILD | WS_VISIBLE, 0))
{
delete m_pInfoSheet;
m_pInfoSheet = NULL;
return -1;
}
// resize the mini frame so that it fits around the child property sheet
CRect rectClient, rectWindow;
// property sheet's window rectangle
m_pInfoSheet->GetWindowRect(rectClient);
// becomes mini frame's client rectangle
rectWindow = rectClient;
// add the width and height needed from the mini frame's borders
CalcWindowRect(rectWindow);
// get screen size
int iScreenWidth = ::GetSystemMetrics(SM_CXSCREEN);
int iScreenHeight = ::GetSystemMetrics(SM_CYSCREEN);
// rectangle to hold status bar size
CRect rectStatusBar;
// get status bar rectangle
pMainFrame->m_wndStatusBar.GetWindowRect( rectStatusBar);
// offset mini frame window coordinates so it fits in lower left part of the screen
rectWindow.OffsetRect( 3, iScreenHeight - rectWindow.Height() - rectStatusBar.Height() - 3);
// move frame window to new position
SetWindowPos( NULL, rectWindow.left, rectWindow.top, rectWindow.Width(), rectWindow.Height(),
SWP_NOZORDER | SWP_NOACTIVATE);
// set property sheet position and type
m_pInfoSheet->SetWindowPos( NULL, 0, 0, rectClient.Width(), rectClient.Height(),
SWP_NOZORDER | SWP_NOACTIVATE);
return 0;
}
void CDlgInfoFrame::OnClose()
{
// Instead of closing the modeless property sheet, just hide it.
CMainFrame* pMainFrame = STATIC_DOWNCAST(CMainFrame, AfxGetMainWnd());
pMainFrame->HideModelessInfoSheet();
}
BOOL CDlgInfoFrame::PreTranslateMessage(MSG* pMsg)
{
if( pMsg->message == WM_SYSCOMMAND)
{
if( (pMsg->wParam == SC_MINIMIZE) || ( pMsg->wParam == SC_MAXIMIZE))
pMsg->wParam = SC_RESTORE;
}
return CMiniFrameWnd::PreTranslateMessage(pMsg);
}
void CDlgInfoFrame::OnSize(UINT nType, int cx, int cy)
{
CMiniFrameWnd::OnSize(nType, cx, cy);
SetSizes();
}
void CDlgInfoFrame::SetSizes()
{
return;
// first we calculate current page's bounding rectangle
CPropertyPage* pPage = m_pInfoSheet->GetActivePage();
ASSERT( pPage != NULL);
// we will obtain dialog template structure and use it to extract width and height
// of document template
DLGTEMPLATE *pdlgTemplate;
char strResourceID[ 10];
// create string containing string "#xxx" where xxx is resource (dialog) ID
sprintf( strResourceID, "#%d", pPage->m_psp.pszTemplate);
HRSRC hrsrc = FindResource(NULL, CString(strResourceID), RT_DIALOG);
HGLOBAL hglb = LoadResource(NULL, hrsrc);
pdlgTemplate = (DLGTEMPLATE *) LockResource(hglb);
// get base units needed to calculate right width and height
DWORD dwDlgBase = GetDialogBaseUnits();
m_PageWidth = pdlgTemplate->cx * LOWORD(dwDlgBase) / 4;
m_PageHeight = pdlgTemplate->cy * HIWORD(dwDlgBase) / 8;
CRect rectPage = CRect( 0, 0, m_PageWidth, m_PageHeight);
// we will set tab control's size so it fits arround active property page
CRect rectTabCtrl;
// get tab control object
CTabCtrl *pTabCtrl = m_pInfoSheet->GetTabControl();
ASSERT( pTabCtrl != NULL);
pTabCtrl->MoveWindow( &rectPage);
m_pInfoSheet->MoveWindow( &rectPage);
// now we will resize frame so that it fits around the property sheet.
CRect rectFrame;
// get sheet's size into frame's rectangle
rectFrame = rectPage;
// add border and title bar sizes to gain bounding's frame dimensions
CalcWindowRect( rectFrame);
// convert coodinates from client into screen
ClientToScreen( rectFrame);
// set new frame position
MoveWindow( rectFrame);
// resize page
#define PAGE_OFFSET_X 2
#define PAGE_OFFSET_Y 25
#define PAGE_SUB_WIDTH 2
#define PAGE_SUB_HEIGHT 2
rectPage = CRect( PAGE_OFFSET_X, PAGE_OFFSET_Y,
m_PageWidth-PAGE_SUB_WIDTH, m_PageHeight-PAGE_SUB_HEIGHT);
pPage->MoveWindow( rectPage);
}