279 lines
7.3 KiB
C++
279 lines
7.3 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* 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, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
#include "bagel/afxwin.h"
|
|
#include "bagel/hodjnpodj/hnplibs/bitmaps.h"
|
|
#include "bagel/hodjnpodj/hnplibs/cbofdlg.h"
|
|
|
|
namespace Bagel {
|
|
namespace HodjNPodj {
|
|
|
|
CBmpDialog::CBmpDialog(CWnd *pParent, CPalette *pPalette, int nID, const char *pFileName, const int dx, const int dy, bool bSaveBackground)
|
|
: CDialog(nID, pParent) {
|
|
// can't access null pointers
|
|
//
|
|
assert(pParent != nullptr);
|
|
assert(pPalette != nullptr);
|
|
assert(pFileName != nullptr);
|
|
|
|
// Inits
|
|
//
|
|
m_pDlgBackground = nullptr;
|
|
m_pParentWnd = pParent;
|
|
m_pPalette = pPalette;
|
|
m_pBmpFileName = pFileName;
|
|
m_nDx = dx;
|
|
m_nDy = dy;
|
|
m_bSaveBackground = bSaveBackground;
|
|
|
|
//{{AFX_DATA_INIT(CBmpDialog)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
CBmpDialog::CBmpDialog(CWnd *pParent, CPalette *pPalette, int nID, int nBmpID, const int dx, const int dy, bool bSaveBackground)
|
|
: CDialog(nID, pParent) {
|
|
// can't access null pointers
|
|
//
|
|
assert(pParent != nullptr);
|
|
assert(pPalette != nullptr);
|
|
|
|
// Inits
|
|
//
|
|
m_pDlgBackground = nullptr;
|
|
m_pBmpFileName = nullptr;
|
|
m_pParentWnd = pParent;
|
|
m_pPalette = pPalette;
|
|
m_nBmpID = nBmpID;
|
|
m_nDx = dx;
|
|
m_nDy = dy;
|
|
m_bSaveBackground = bSaveBackground;
|
|
|
|
//{{AFX_DATA_INIT(CBmpDialog)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
|
|
void CBmpDialog::DoDataExchange(CDataExchange *pDX) {
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CBmpDialog)
|
|
// NOTE: the ClassWizard will add DDX and DDV calls here
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
void CBmpDialog::EndDialog(int nResult) {
|
|
if (m_pDlgBackground != nullptr) {
|
|
RefreshBackground();
|
|
ValidateRect(nullptr);
|
|
}
|
|
CDialog::EndDialog(nResult);
|
|
}
|
|
|
|
|
|
void CBmpDialog::OnDestroy() {
|
|
bool bUpdateNeeded;
|
|
|
|
//
|
|
// delete the bitmap created with FetchScreenBitmap
|
|
//
|
|
if (m_pDlgBackground != nullptr) {
|
|
m_pDlgBackground->DeleteObject();
|
|
delete m_pDlgBackground;
|
|
m_pDlgBackground = nullptr;
|
|
|
|
bUpdateNeeded = (*m_pParentWnd).GetUpdateRect(nullptr, false);
|
|
if (bUpdateNeeded)
|
|
(*m_pParentWnd).ValidateRect(nullptr);
|
|
}
|
|
|
|
CDialog::OnDestroy();
|
|
}
|
|
|
|
|
|
bool CBmpDialog::OnInitDialog() {
|
|
CRect cDlgRect, cWindRect;
|
|
int iDlgWidth, iDlgHeight; // size of dialog box
|
|
CDC *pDC;
|
|
CBitmap *pBitmap;
|
|
CSize cSize;
|
|
|
|
CDialog::OnInitDialog(); // do basic dialog initialization
|
|
|
|
// get the button's position and size
|
|
|
|
(*m_pParentWnd).GetWindowRect(&cWindRect); // get pos/size of parent
|
|
((CWnd *)this)->GetWindowRect(&cDlgRect); // get pos/size of dialog
|
|
|
|
pDC = GetDC();
|
|
assert(pDC != nullptr);
|
|
|
|
if (m_pBmpFileName == nullptr) // try to fetch the bitmap
|
|
pBitmap = FetchResourceBitmap(pDC, nullptr, m_nBmpID);
|
|
else
|
|
pBitmap = FetchBitmap(pDC, nullptr, m_pBmpFileName);
|
|
if (pBitmap == nullptr) { // no luck, so use what we know
|
|
iDlgWidth = cDlgRect.right - cDlgRect.left; // dlg box width
|
|
iDlgHeight = cDlgRect.bottom - cDlgRect.top; // dlg box height
|
|
} else {
|
|
cSize = GetBitmapSize(pBitmap); // actual width and height from bitmap
|
|
iDlgWidth = cSize.cx;
|
|
iDlgHeight = cSize.cy;
|
|
delete pBitmap;
|
|
}
|
|
|
|
// modify code below to center dialog box based on GAME_WIDTH and GAME_HEIGHT
|
|
// center the dialog box on the screen
|
|
|
|
if (m_nDx == -1) { // no horizontal location, so center
|
|
//...the dialog box horizontally
|
|
cDlgRect.left = cWindRect.left + (cWindRect.right - cWindRect.left - iDlgWidth) / 2;
|
|
} else { // want it in a specific horiz.loc.
|
|
cDlgRect.left = cWindRect.left + m_nDx;
|
|
}
|
|
cDlgRect.right = cDlgRect.left + iDlgWidth; // set the right side
|
|
|
|
if (m_nDy == -1) { // no vertical location, so center
|
|
//...the dialog box vertically
|
|
cDlgRect.top = cWindRect.top + (cWindRect.bottom - cWindRect.top - iDlgHeight) / 2;
|
|
} else { // want it in a specific vertical loc.
|
|
cDlgRect.top = cWindRect.top + m_nDy;
|
|
}
|
|
cDlgRect.bottom = cDlgRect.top + iDlgHeight;
|
|
|
|
MoveWindow(&cDlgRect, false); // position window, don't repaint
|
|
|
|
// if we are saving the background
|
|
//
|
|
if (m_bSaveBackground) {
|
|
// save a copy of the background
|
|
m_pDlgBackground = FetchScreenBitmap(pDC, m_pPalette, 0, 0, iDlgWidth, iDlgHeight);
|
|
}
|
|
|
|
ReleaseDC(pDC);
|
|
|
|
return true; // return true unless focused on a control
|
|
}
|
|
|
|
|
|
bool CBmpDialog::OnEraseBkgnd(CDC *pDC) {
|
|
return true;
|
|
}
|
|
|
|
|
|
void CBmpDialog::RefreshBackground(CDC *pDC) {
|
|
CDC *pMyDC;
|
|
|
|
// paint back the background
|
|
//
|
|
if (m_pDlgBackground != nullptr) {
|
|
if (pDC == nullptr) {
|
|
if ((pMyDC = GetDC()) != nullptr) {
|
|
PaintBitmap(pMyDC, m_pPalette, m_pDlgBackground, 0, 0);
|
|
ReleaseDC(pMyDC);
|
|
}
|
|
} else
|
|
PaintBitmap(pDC, m_pPalette, m_pDlgBackground, 0, 0);
|
|
}
|
|
}
|
|
|
|
|
|
void CBmpDialog::OnPaint() {
|
|
InvalidateRect(nullptr, false);
|
|
|
|
CPaintDC dc(this); // device context for painting
|
|
CPalette *pPalOld = nullptr;
|
|
bool bSuccess;
|
|
|
|
if (m_pPalette != nullptr) {
|
|
pPalOld = dc.SelectPalette(m_pPalette, false);
|
|
dc.RealizePalette();
|
|
}
|
|
|
|
// repaint the background behind the dialog
|
|
//
|
|
RefreshBackground(&dc);
|
|
|
|
if (m_pDlgBackground != nullptr) {
|
|
bSuccess = PaintBitmap(&dc, m_pPalette, m_pDlgBackground, 0, 0);
|
|
assert(bSuccess);
|
|
}
|
|
|
|
// paint the dialog (uses bitmap instead of standard windows dialog)
|
|
//
|
|
if (m_pBmpFileName != nullptr) {
|
|
bSuccess = PaintMaskedDIB(&dc, m_pPalette, m_pBmpFileName, 0, 0);
|
|
} else {
|
|
bSuccess = PaintMaskedResource(&dc, m_pPalette, m_nBmpID, 0, 0);
|
|
}
|
|
|
|
assert(bSuccess);
|
|
|
|
if (m_pPalette != nullptr)
|
|
dc.SelectPalette(pPalOld, false);
|
|
}
|
|
|
|
|
|
void CBmpDialog::OnShowWindow(bool bShow, unsigned int nStatus) {
|
|
CDialog::OnShowWindow(bShow, nStatus);
|
|
}
|
|
|
|
|
|
void CBmpDialog::OnSize(unsigned int nType, int cx, int cy) {
|
|
CDialog::OnSize(nType, cx, cy);
|
|
}
|
|
|
|
|
|
int CBmpDialog::OnCreate(LPCREATESTRUCT lpCreateStruct) {
|
|
if (CDialog::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void CBmpDialog::OnLButtonDown(unsigned int nFlags, CPoint point) {
|
|
CDialog::OnLButtonDown(nFlags, point);
|
|
}
|
|
|
|
|
|
void CBmpDialog::OnMouseMove(unsigned int nFlags, CPoint point) {
|
|
CDialog::OnMouseMove(nFlags, point);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CBmpDialog, CDialog)
|
|
//{{AFX_MSG_MAP(CBmpDialog)
|
|
ON_WM_CREATE()
|
|
ON_WM_ERASEBKGND()
|
|
ON_WM_PAINT()
|
|
ON_WM_SHOWWINDOW()
|
|
ON_WM_SIZE()
|
|
ON_WM_MOUSEMOVE()
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_NCMOUSEMOVE()
|
|
ON_WM_DESTROY()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
} // namespace HodjNPodj
|
|
} // namespace Bagel
|