1045 lines
22 KiB
C
1045 lines
22 KiB
C
/****************************************************************************
|
|
|
|
PROGRAM: WinMine (a.k.a. Mines, BombSquad, MineSweeper...)
|
|
|
|
****************************************************************************/
|
|
|
|
#define _WINDOWS
|
|
#include <windows.h>
|
|
#include <port1632.h>
|
|
#include <htmlhelp.h> // for HtmlHelp()
|
|
#include <commctrl.h> // for fusion classes.
|
|
|
|
#include "main.h"
|
|
#include "rtns.h"
|
|
#include "grafix.h"
|
|
#include "res.h"
|
|
#include "pref.h"
|
|
#include "util.h"
|
|
#include "sound.h"
|
|
#include "context.h"
|
|
#include "string.h"
|
|
#include "stdio.h"
|
|
#include "dos.h"
|
|
|
|
#ifndef WM_ENTERMENULOOP
|
|
#define WM_ENTERMENULOOP 0x0211
|
|
#define WM_EXITMENULOOP 0x0212
|
|
#endif
|
|
|
|
BOOL bInitMinimized; /* Bug #13328: HACK! Don't permit MoveWindow or */
|
|
/* InvalidateRect when initially minimized. */
|
|
/* 19 September 1991 Clark R. Cyr */
|
|
|
|
HANDLE hInst;
|
|
HWND hwndMain;
|
|
HMENU hMenu;
|
|
|
|
// Icon handles to load the winmine icon.
|
|
HICON hIconMain;
|
|
|
|
BOOL fButton1Down = fFalse;
|
|
BOOL fBlock = fFalse;
|
|
BOOL fIgnoreClick = fFalse;
|
|
|
|
INT dypCaption;
|
|
INT dypMenu;
|
|
INT dypBorder;
|
|
INT dxpBorder;
|
|
|
|
INT fStatus = (fDemo + fIcon);
|
|
BOOL fLocalPause = fFalse;
|
|
|
|
TCHAR szClass[cchNameMax];
|
|
#define szWindowTitle szClass
|
|
|
|
TCHAR szTime[cchNameMax];
|
|
TCHAR szDefaultName[cchNameMax];
|
|
|
|
|
|
extern BOOL fUpdateIni;
|
|
|
|
extern INT xCur;
|
|
extern INT yCur;
|
|
extern INT iButtonCur;
|
|
|
|
extern INT xBoxMac;
|
|
extern INT yBoxMac;
|
|
|
|
extern PREF Preferences;
|
|
extern INT cBoxVisit;
|
|
|
|
INT dxWindow;
|
|
INT dyWindow;
|
|
INT dypCaption;
|
|
INT dypMenu;
|
|
INT dypAdjust;
|
|
|
|
|
|
INT idRadCurr = 0;
|
|
|
|
#define iPrefMax 3
|
|
#define idRadMax 3
|
|
|
|
INT rgPrefEditID[iPrefMax] =
|
|
{ID_EDIT_MINES, ID_EDIT_HEIGHT, ID_EDIT_WIDTH};
|
|
|
|
INT rgLevelData[idRadMax][iPrefMax] = {
|
|
{10, MINHEIGHT, MINWIDTH, },
|
|
{40, 16, 16,},
|
|
{99, 16, 30,}
|
|
};
|
|
|
|
|
|
#ifndef DEBUG
|
|
#define XYZZY
|
|
#define cchXYZZY 5
|
|
INT iXYZZY = 0;
|
|
TCHAR szXYZZY[cchXYZZY+1] = TEXT("XYZZY");
|
|
extern CHAR rgBlk[cBlkMax];
|
|
#endif
|
|
|
|
|
|
LRESULT APIENTRY MainWndProc(HWND, UINT, WPARAM, LPARAM);
|
|
INT_PTR APIENTRY PrefDlgProc(HWND, UINT, WPARAM, LPARAM);
|
|
INT_PTR APIENTRY BestDlgProc(HWND, UINT, WPARAM, LPARAM);
|
|
INT_PTR APIENTRY EnterDlgProc(HWND, UINT, WPARAM, LPARAM);
|
|
|
|
|
|
|
|
|
|
|
|
/****** W I N M A I N ******/
|
|
|
|
MMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow)
|
|
/* { */
|
|
MSG msg;
|
|
HANDLE hAccel;
|
|
|
|
hInst = hInstance;
|
|
|
|
InitConst();
|
|
|
|
bInitMinimized = (nCmdShow == SW_SHOWMINNOACTIVE) ||
|
|
(nCmdShow == SW_SHOWMINIMIZED) ;
|
|
|
|
#ifdef WIN16
|
|
if (hPrevInstance)
|
|
{
|
|
HWND hWnd = FindWindow(szClass, NULL);
|
|
hWnd = GetLastActivePopup(hWnd);
|
|
BringWindowToTop(hWnd);
|
|
if (!bInitMinimized && IsIconic(hWnd))
|
|
SendMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0L);
|
|
return fFalse;
|
|
}
|
|
#endif
|
|
|
|
#ifdef NOSERVER /*** Not in final release ***/
|
|
{
|
|
TCHAR szFile[256];
|
|
|
|
GetModuleFileName(hInst, szFile, 250);
|
|
|
|
if (szFile[0] > TEXT('C'))
|
|
{
|
|
szFile[0] = TEXT('X');
|
|
if (!lstrcmp(szFile, TEXT("X:\\WINGAMES\\WINMINE\\WINMINE.EXE")))
|
|
{
|
|
MessageBox(GetFocus(),
|
|
TEXT("Please copy winmine.exe and aboutwep.dll to your machine and run it from there."),
|
|
TEXT("NO NO NO NO NO"),
|
|
MB_OK);
|
|
return fFalse;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifdef EXPIRE /*** Not in final release ***/
|
|
{
|
|
struct dosdate_t ddt;
|
|
|
|
_dos_getdate(&ddt);
|
|
|
|
if ((ddt.month + ddt.year*12) > (9 + 1990*12))
|
|
{
|
|
MessageBox(GetFocus(),
|
|
TEXT("This game has expired. Please obtain an official copy from the Windows Entertainment Package."),
|
|
TEXT("SORRY"),
|
|
MB_OK);
|
|
return fFalse;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
{
|
|
WNDCLASS wc;
|
|
INITCOMMONCONTROLSEX icc; // common control registration.
|
|
|
|
// Register the common controls.
|
|
icc.dwSize = sizeof(INITCOMMONCONTROLSEX);
|
|
icc.dwICC = ICC_ANIMATE_CLASS | ICC_BAR_CLASSES | ICC_COOL_CLASSES | ICC_HOTKEY_CLASS | ICC_LISTVIEW_CLASSES |
|
|
ICC_PAGESCROLLER_CLASS | ICC_PROGRESS_CLASS | ICC_TAB_CLASSES | ICC_UPDOWN_CLASS | ICC_USEREX_CLASSES;
|
|
InitCommonControlsEx(&icc);
|
|
|
|
|
|
hIconMain = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_MAIN));
|
|
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = MainWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = 0;
|
|
wc.hInstance = hInst;
|
|
wc.hIcon = hIconMain;
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);
|
|
wc.lpszMenuName = NULL;
|
|
wc.lpszClassName = szClass;
|
|
|
|
if (!RegisterClass(&wc))
|
|
return fFalse;
|
|
}
|
|
|
|
hMenu = LoadMenu(hInst, MAKEINTRESOURCE(ID_MENU));
|
|
hAccel = LoadAccelerators(hInst, MAKEINTRESOURCE(ID_MENU_ACCEL));
|
|
|
|
|
|
ReadPreferences();
|
|
|
|
hwndMain = CreateWindow( szClass, szWindowTitle,
|
|
WS_OVERLAPPED | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU,
|
|
Preferences.xWindow-dxpBorder, Preferences.yWindow-dypAdjust,
|
|
dxWindow+dxpBorder, dyWindow +dypAdjust,
|
|
NULL, NULL, hInst, NULL);
|
|
|
|
if (!hwndMain)
|
|
{
|
|
ReportErr(1000);
|
|
return fFalse;
|
|
}
|
|
|
|
AdjustWindow(fCalc);
|
|
|
|
|
|
if (!FInitLocal())
|
|
{
|
|
ReportErr(ID_ERR_MEM);
|
|
return fFalse;
|
|
}
|
|
|
|
SetMenuBar(Preferences.fMenu);
|
|
|
|
StartGame();
|
|
|
|
ShowWindow(hwndMain, SW_SHOWNORMAL);
|
|
UpdateWindow(hwndMain);
|
|
|
|
bInitMinimized = FALSE;
|
|
|
|
while (GetMessage(&msg, NULL, 0, 0))
|
|
{
|
|
if (!TranslateAccelerator(hwndMain, hAccel, &msg))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
}
|
|
|
|
CleanUp();
|
|
|
|
if (fUpdateIni)
|
|
WritePreferences();
|
|
|
|
return ((INT) msg.wParam);
|
|
}
|
|
|
|
|
|
/****** F L O C A L B U T T O N ******/
|
|
|
|
BOOL FLocalButton(LPARAM lParam)
|
|
{
|
|
BOOL fDown = fTrue;
|
|
RECT rcCapt;
|
|
MSG msg;
|
|
|
|
msg.pt.x = LOWORD(lParam);
|
|
msg.pt.y = HIWORD(lParam);
|
|
|
|
rcCapt.right = dxButton + (rcCapt.left = (dxWindow-dxButton) >> 1);
|
|
rcCapt.bottom = dyButton + (rcCapt.top = dyTopLed);
|
|
|
|
if (!PtInRect(&rcCapt, msg.pt))
|
|
return fFalse;
|
|
|
|
SetCapture(hwndMain);
|
|
|
|
DisplayButton(iButtonDown);
|
|
|
|
MapWindowPoints(hwndMain , NULL , (LPPOINT) &rcCapt , 2);
|
|
|
|
while (fTrue)
|
|
{
|
|
if (PeekMessage(&msg, hwndMain, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE))
|
|
{
|
|
|
|
switch (msg.message)
|
|
{
|
|
case WM_LBUTTONUP:
|
|
if (fDown)
|
|
{
|
|
if (PtInRect(&rcCapt, msg.pt))
|
|
{
|
|
DisplayButton(iButtonCur = iButtonHappy);
|
|
StartGame();
|
|
}
|
|
}
|
|
ReleaseCapture();
|
|
return fTrue;
|
|
|
|
case WM_MOUSEMOVE:
|
|
if (PtInRect(&rcCapt, msg.pt))
|
|
{
|
|
if (!fDown)
|
|
{
|
|
fDown = fTrue;
|
|
DisplayButton(iButtonDown);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (fDown)
|
|
{
|
|
fDown = fFalse;
|
|
DisplayButton(iButtonCur);
|
|
}
|
|
}
|
|
default:
|
|
;
|
|
} /* switch */
|
|
}
|
|
|
|
} /* while */
|
|
}
|
|
|
|
|
|
|
|
/****** F I X M E N U S ******/
|
|
|
|
VOID FixMenus(VOID)
|
|
{
|
|
CheckEm(IDM_BEGIN, Preferences.wGameType == wGameBegin);
|
|
CheckEm(IDM_INTER, Preferences.wGameType == wGameInter);
|
|
CheckEm(IDM_EXPERT, Preferences.wGameType == wGameExpert);
|
|
CheckEm(IDM_CUSTOM, Preferences.wGameType == wGameOther);
|
|
|
|
CheckEm(IDM_COLOR, Preferences.fColor);
|
|
CheckEm(IDM_MARK, Preferences.fMark);
|
|
CheckEm(IDM_SOUND, Preferences.fSound);
|
|
}
|
|
|
|
|
|
|
|
/****** D O P R E F ******/
|
|
|
|
VOID DoPref(VOID)
|
|
{
|
|
|
|
DialogBox(hInst, MAKEINTRESOURCE(ID_DLG_PREF), hwndMain, PrefDlgProc);
|
|
|
|
Preferences.wGameType = wGameOther;
|
|
FixMenus();
|
|
fUpdateIni = fTrue;
|
|
StartGame();
|
|
}
|
|
|
|
|
|
/****** D O E N T E R N A M E ******/
|
|
|
|
VOID DoEnterName(VOID)
|
|
{
|
|
DialogBox(hInst, MAKEINTRESOURCE(ID_DLG_ENTER), hwndMain, EnterDlgProc);
|
|
fUpdateIni = fTrue;
|
|
}
|
|
|
|
|
|
/****** D O D I S P L A Y B E S T ******/
|
|
|
|
VOID DoDisplayBest(VOID)
|
|
{
|
|
DialogBox(hInst, MAKEINTRESOURCE(ID_DLG_BEST), hwndMain, BestDlgProc);
|
|
}
|
|
|
|
|
|
/****** M A I N W N D P R O C ******/
|
|
|
|
LRESULT APIENTRY MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
|
|
switch (message)
|
|
{
|
|
case WM_WINDOWPOSCHANGED:
|
|
if (!fStatusIcon)
|
|
{
|
|
Preferences.xWindow = ((LPWINDOWPOS) (lParam))->x;
|
|
Preferences.yWindow = ((LPWINDOWPOS) (lParam))->y;
|
|
}
|
|
break;
|
|
|
|
case WM_SYSCOMMAND:
|
|
switch (wParam & 0xFFF0)
|
|
{
|
|
case SC_MINIMIZE:
|
|
|
|
PauseGame();
|
|
SetStatusPause;
|
|
SetStatusIcon;
|
|
break;
|
|
|
|
case SC_RESTORE:
|
|
ClrStatusPause;
|
|
ClrStatusIcon;
|
|
ResumeGame();
|
|
|
|
//Japan Bug fix: 1/19/93 Enable the first click after restoring from icon.
|
|
fIgnoreClick = fFalse;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
switch(GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
|
|
case IDM_NEW:
|
|
StartGame();
|
|
break;
|
|
|
|
/** IDM_NEW **/
|
|
case IDM_EXIT:
|
|
ShowWindow(hwndMain, SW_HIDE);
|
|
#ifdef ORGCODE
|
|
goto LExit;
|
|
#else
|
|
SendMessage(hwndMain, WM_SYSCOMMAND, SC_CLOSE, 0);
|
|
return(0);
|
|
#endif
|
|
/** IDM_SKILL **/
|
|
case IDM_BEGIN:
|
|
case IDM_INTER:
|
|
case IDM_EXPERT:
|
|
Preferences.wGameType = (WORD)(GET_WM_COMMAND_ID(wParam, lParam) - IDM_BEGIN);
|
|
Preferences.Mines = rgLevelData[Preferences.wGameType][0];
|
|
Preferences.Height = rgLevelData[Preferences.wGameType][1];
|
|
Preferences.Width = rgLevelData[Preferences.wGameType][2];
|
|
StartGame();
|
|
goto LUpdateMenu;
|
|
|
|
case IDM_CUSTOM:
|
|
DoPref();
|
|
break;
|
|
|
|
/** IDM_OPTIONS **/
|
|
case IDM_SOUND:
|
|
if (Preferences.fSound)
|
|
{
|
|
EndTunes();
|
|
Preferences.fSound = fFalse;
|
|
}
|
|
else
|
|
{
|
|
Preferences.fSound = FInitTunes();
|
|
}
|
|
goto LUpdateMenu;
|
|
|
|
case IDM_COLOR:
|
|
Preferences.fColor = !Preferences.fColor;
|
|
FreeBitmaps();
|
|
if (!FLoadBitmaps())
|
|
{
|
|
ReportErr(ID_ERR_MEM);
|
|
#ifdef ORGCODE
|
|
goto LExit;
|
|
#else
|
|
SendMessage(hwndMain, WM_SYSCOMMAND, SC_CLOSE, 0);
|
|
return(0);
|
|
#endif
|
|
}
|
|
DisplayScreen();
|
|
goto LUpdateMenu;
|
|
|
|
case IDM_MARK:
|
|
Preferences.fMark = !Preferences.fMark;
|
|
/* IE goto LUpdateMenu; */
|
|
|
|
LUpdateMenu:
|
|
fUpdateIni = fTrue;
|
|
SetMenuBar(Preferences.fMenu);
|
|
break;
|
|
|
|
case IDM_BEST:
|
|
DoDisplayBest();
|
|
break;
|
|
|
|
|
|
/** IDM_HELP **/
|
|
case IDM_HELP:
|
|
DoHelp(HELP_INDEX, HH_DISPLAY_TOPIC);
|
|
break;
|
|
|
|
case IDM_HOW2PLAY:
|
|
DoHelp(HELP_CONTEXT, HH_DISPLAY_INDEX);
|
|
break;
|
|
|
|
case IDM_HELP_HELP:
|
|
DoHelp(HELP_HELPONHELP, HH_DISPLAY_TOPIC);
|
|
break;
|
|
|
|
case IDM_HELP_ABOUT:
|
|
DoAbout();
|
|
return 0;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
} /**** END OF MENUS ****/
|
|
|
|
break;
|
|
|
|
|
|
|
|
case WM_KEYDOWN:
|
|
switch (wParam)
|
|
{
|
|
|
|
#if 0
|
|
case VK_F1:
|
|
DoHelp(HELP_INDEX, 0L);
|
|
break;
|
|
|
|
case VK_F2:
|
|
StartGame();
|
|
break;
|
|
|
|
case VK_F3:
|
|
break;
|
|
|
|
#endif
|
|
case VK_F4:
|
|
if (FSoundSwitchable())
|
|
if (FSoundOn())
|
|
{
|
|
EndTunes();
|
|
Preferences.fSound = fsoundOff;
|
|
}
|
|
else
|
|
Preferences.fSound = FInitTunes();
|
|
break;
|
|
|
|
case VK_F5:
|
|
if (FMenuSwitchable())
|
|
SetMenuBar(fmenuOff);
|
|
break;
|
|
|
|
case VK_F6:
|
|
if (FMenuSwitchable())
|
|
SetMenuBar(fmenuOn);
|
|
break;
|
|
|
|
#ifdef XYZZY
|
|
case VK_SHIFT:
|
|
if (iXYZZY >= cchXYZZY)
|
|
iXYZZY ^= 20;
|
|
break;
|
|
|
|
default:
|
|
if (iXYZZY < cchXYZZY)
|
|
iXYZZY = (szXYZZY[iXYZZY] == (TCHAR) wParam) ? iXYZZY+1 : 0;
|
|
break;
|
|
|
|
#else
|
|
default:
|
|
break;
|
|
#endif
|
|
}
|
|
break;
|
|
|
|
/* case WM_QUERYENDSESSION: SHOULDNT BE USED (JAP)*/
|
|
|
|
case WM_DESTROY:
|
|
//LExit:
|
|
KillTimer(hwndMain, ID_TIMER);
|
|
PostQuitMessage(0);
|
|
break;
|
|
|
|
case WM_MBUTTONDOWN:
|
|
if (fIgnoreClick)
|
|
{
|
|
fIgnoreClick = fFalse;
|
|
return 0;
|
|
}
|
|
|
|
if (!fStatusPlay)
|
|
break;
|
|
|
|
fBlock = fTrue;
|
|
goto LBigStep;
|
|
|
|
case WM_LBUTTONDOWN:
|
|
|
|
if (fIgnoreClick)
|
|
{
|
|
fIgnoreClick = fFalse;
|
|
return 0;
|
|
}
|
|
|
|
if (FLocalButton(lParam))
|
|
return 0;
|
|
|
|
if (!fStatusPlay)
|
|
break;
|
|
fBlock = (wParam & (MK_SHIFT | MK_RBUTTON)) ? fTrue : fFalse;
|
|
|
|
LBigStep:
|
|
SetCapture(hWnd);
|
|
fButton1Down = fTrue;
|
|
|
|
xCur = -1;
|
|
yCur = -1;
|
|
DisplayButton(iButtonCaution);
|
|
|
|
case WM_MOUSEMOVE:
|
|
if (fButton1Down)
|
|
{
|
|
if (fStatus & fPlay)
|
|
TrackMouse(xBoxFromXpos(LOWORD(lParam)), yBoxFromYpos(HIWORD(lParam)) );
|
|
else
|
|
goto LFixTimeOut;
|
|
}
|
|
#ifdef XYZZY
|
|
//
|
|
// This is the cheat:
|
|
// If you hold down the shift key and type 'XYZZY'
|
|
// then when you hold down the control key, to upper
|
|
// left hand corner pixel will show the state of the
|
|
// mine field under the mouse. Oh. joy. I can win.
|
|
//
|
|
else if (iXYZZY != 0)
|
|
if (((iXYZZY == cchXYZZY) && (wParam & MK_CONTROL))
|
|
||(iXYZZY > cchXYZZY))
|
|
{
|
|
xCur = xBoxFromXpos(LOWORD(lParam));
|
|
yCur = yBoxFromYpos(HIWORD(lParam));
|
|
if (fInRange(xCur, yCur))
|
|
{
|
|
HDC hDC = GetDC(NULL);
|
|
SetPixel(hDC, 0, 0, fISBOMB(xCur, yCur) ? 0L : 0x00FFFFFFL);
|
|
ReleaseDC(NULL, hDC);
|
|
}
|
|
}
|
|
#endif
|
|
break;
|
|
|
|
case WM_RBUTTONUP:
|
|
case WM_MBUTTONUP:
|
|
case WM_LBUTTONUP:
|
|
if (fButton1Down)
|
|
{
|
|
LFixTimeOut:
|
|
fButton1Down = fFalse;
|
|
ReleaseCapture();
|
|
if (fStatus & fPlay)
|
|
DoButton1Up();
|
|
else
|
|
TrackMouse(-2,-2);
|
|
}
|
|
break;
|
|
|
|
case WM_RBUTTONDOWN:
|
|
if (fIgnoreClick)
|
|
{
|
|
fIgnoreClick = fFalse;
|
|
return 0;
|
|
}
|
|
|
|
if(!fStatusPlay)
|
|
break;
|
|
|
|
if (fButton1Down)
|
|
{
|
|
TrackMouse(-3,-3);
|
|
fBlock = fTrue;
|
|
PostMessage(hwndMain, WM_MOUSEMOVE, wParam, lParam);
|
|
}
|
|
else if (wParam & MK_LBUTTON)
|
|
goto LBigStep;
|
|
else if (!fLocalPause)
|
|
MakeGuess(xBoxFromXpos(LOWORD(lParam)), yBoxFromYpos(HIWORD(lParam)) );
|
|
return 0;
|
|
|
|
case WM_ACTIVATE:
|
|
/* Window is being activated by a mouse click */
|
|
if (GET_WM_ACTIVATE_STATE(wParam, lParam) == 2)
|
|
fIgnoreClick = fTrue;
|
|
break;
|
|
|
|
case WM_TIMER:
|
|
#ifdef CHEAT
|
|
if (!fLocalPause)
|
|
#endif
|
|
DoTimer();
|
|
return 0;
|
|
|
|
case WM_ENTERMENULOOP:
|
|
fLocalPause = fTrue;
|
|
break;
|
|
|
|
case WM_EXITMENULOOP:
|
|
fLocalPause = fFalse;
|
|
break;
|
|
|
|
case WM_PAINT:
|
|
{
|
|
PAINTSTRUCT ps;
|
|
HDC hDC = BeginPaint(hWnd,&ps);
|
|
DrawScreen(hDC);
|
|
EndPaint(hWnd, &ps);
|
|
}
|
|
return 0;
|
|
|
|
default:
|
|
break;
|
|
|
|
}
|
|
|
|
return (DefWindowProc(hWnd, message, wParam, lParam));
|
|
}
|
|
|
|
|
|
|
|
|
|
/****** DIALOG PROCEDURES ******/
|
|
|
|
/*** P R E F D L G P R O C ***/
|
|
|
|
INT_PTR APIENTRY PrefDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
// for context sensitive help
|
|
static DWORD aIds[] = {
|
|
ID_EDIT_HEIGHT, IDH_PREF_EDIT_HEIGHT,
|
|
ID_EDIT_WIDTH, IDH_PREF_EDIT_WIDTH,
|
|
ID_EDIT_MINES, IDH_PREF_EDIT_MINES,
|
|
ID_TXT_HEIGHT, IDH_PREF_EDIT_HEIGHT,
|
|
ID_TXT_WIDTH, IDH_PREF_EDIT_WIDTH,
|
|
ID_TXT_MINES, IDH_PREF_EDIT_MINES,
|
|
0,0 };
|
|
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
SetDlgItemInt(hDlg, ID_EDIT_HEIGHT, Preferences.Height ,fFalse);
|
|
SetDlgItemInt(hDlg, ID_EDIT_WIDTH, Preferences.Width ,fFalse);
|
|
SetDlgItemInt(hDlg, ID_EDIT_MINES, Preferences.Mines ,fFalse);
|
|
return (fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch(GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
case ID_BTN_OK:
|
|
case IDOK:
|
|
{
|
|
|
|
Preferences.Height = GetDlgInt(hDlg, ID_EDIT_HEIGHT, MINHEIGHT, 24);
|
|
Preferences.Width = GetDlgInt(hDlg, ID_EDIT_WIDTH, MINWIDTH, 30);
|
|
Preferences.Mines = GetDlgInt(hDlg, ID_EDIT_MINES, 10,
|
|
min(999, (Preferences.Height-1) * (Preferences.Width-1) ) );
|
|
|
|
}
|
|
|
|
/* Fall Through & Exit */
|
|
case ID_BTN_CANCEL:
|
|
case IDCANCEL:
|
|
EndDialog(hDlg, fTrue); /* Exits the dialog box */
|
|
return fTrue;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
// context sensitive help.
|
|
case WM_HELP:
|
|
WinHelp(((LPHELPINFO) lParam)->hItemHandle, TEXT("winmine.hlp"),
|
|
HELP_WM_HELP, (ULONG_PTR) aIds);
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
WinHelp((HWND) wParam, TEXT("winmine.hlp"), HELP_CONTEXTMENU,
|
|
(ULONG_PTR) aIds);
|
|
break;
|
|
}
|
|
|
|
return (fFalse); /* Didn't process a message */
|
|
}
|
|
|
|
|
|
/*** S E T D T E X T ***/
|
|
|
|
VOID SetDText(HWND hDlg, INT id, INT time, TCHAR FAR * szName)
|
|
{
|
|
TCHAR sz[cchNameMax];
|
|
|
|
wsprintf(sz, szTime, time);
|
|
SetDlgItemText(hDlg, id, sz);
|
|
SetDlgItemText(hDlg, id+1, szName);
|
|
}
|
|
|
|
|
|
/****** B E S T D L G P R O C ******/
|
|
|
|
INT_PTR APIENTRY BestDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
// for context sensitive help
|
|
static DWORD aIds[] = {
|
|
ID_BTN_RESET, IDH_BEST_BTN_RESET,
|
|
ID_STEXT1, IDH_STEXT,
|
|
ID_STEXT2, IDH_STEXT,
|
|
ID_STEXT3, IDH_STEXT,
|
|
ID_TIME_BEGIN, IDH_STEXT,
|
|
ID_TIME_INTER, IDH_STEXT,
|
|
ID_TIME_EXPERT, IDH_STEXT,
|
|
ID_NAME_BEGIN, IDH_STEXT,
|
|
ID_NAME_INTER, IDH_STEXT,
|
|
ID_NAME_EXPERT, IDH_STEXT,
|
|
|
|
0,0 };
|
|
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
LReset:
|
|
SetDText(hDlg, ID_TIME_BEGIN, Preferences.rgTime[wGameBegin], Preferences.szBegin);
|
|
SetDText(hDlg, ID_TIME_INTER, Preferences.rgTime[wGameInter], Preferences.szInter);
|
|
SetDText(hDlg, ID_TIME_EXPERT, Preferences.rgTime[wGameExpert], Preferences.szExpert);
|
|
return (fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch(GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
case ID_BTN_RESET:
|
|
Preferences.rgTime[wGameBegin] = Preferences.rgTime[wGameInter]
|
|
= Preferences.rgTime[wGameExpert] = 999;
|
|
lstrcpy(Preferences.szBegin, szDefaultName);
|
|
lstrcpy(Preferences.szInter, szDefaultName);
|
|
lstrcpy(Preferences.szExpert, szDefaultName);
|
|
fUpdateIni = fTrue;
|
|
goto LReset;
|
|
|
|
case ID_BTN_OK:
|
|
case IDOK:
|
|
case ID_BTN_CANCEL:
|
|
case IDCANCEL:
|
|
EndDialog(hDlg, fTrue); /* Exits the dialog box */
|
|
return fTrue;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
// context sensitive help.
|
|
case WM_HELP:
|
|
WinHelp(((LPHELPINFO) lParam)->hItemHandle, TEXT("winmine.hlp"),
|
|
HELP_WM_HELP, (ULONG_PTR) aIds);
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
WinHelp((HWND) wParam, TEXT("winmine.hlp"), HELP_CONTEXTMENU,
|
|
(ULONG_PTR) aIds);
|
|
break;
|
|
}
|
|
|
|
return (fFalse); /* Didn't process a message */
|
|
}
|
|
|
|
|
|
|
|
/****** E N T E R D L G P R O C ******/
|
|
|
|
INT_PTR APIENTRY EnterDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
TCHAR sz[cchMsgMax];
|
|
|
|
LoadSz((WORD)(Preferences.wGameType+ID_MSG_BEGIN), sz, ARRAYSIZE(sz));
|
|
|
|
SetDlgItemText(hDlg, ID_TEXT_BEST, sz);
|
|
|
|
SendMessage(GetDlgItem(hDlg, ID_EDIT_NAME), EM_SETLIMITTEXT, cchNameMax, 0L);
|
|
|
|
SetDlgItemText(hDlg, ID_EDIT_NAME,
|
|
(Preferences.wGameType == wGameBegin) ? Preferences.szBegin :
|
|
(Preferences.wGameType == wGameInter) ? Preferences.szInter :
|
|
Preferences.szExpert);
|
|
}
|
|
return (fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch(GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
case ID_BTN_OK:
|
|
case IDOK:
|
|
case ID_BTN_CANCEL:
|
|
case IDCANCEL:
|
|
|
|
GetDlgItemText(hDlg, ID_EDIT_NAME,
|
|
(Preferences.wGameType == wGameBegin) ? Preferences.szBegin :
|
|
(Preferences.wGameType == wGameInter) ? Preferences.szInter :
|
|
Preferences.szExpert, cchNameMax);
|
|
|
|
EndDialog(hDlg, fTrue); /* Exits the dialog box */
|
|
return fTrue;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return (fFalse); /* Didn't process a message */
|
|
(lParam);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/****** A D J U S T W I N D O W ******/
|
|
|
|
// Our verion of GetSystemMetrics
|
|
//
|
|
// Tries to return whole screen (include other monitor) info
|
|
//
|
|
|
|
INT OurGetSystemMetrics( INT nIndex )
|
|
{
|
|
INT Result=0;
|
|
|
|
switch( nIndex )
|
|
{
|
|
case SM_CXSCREEN:
|
|
Result= GetSystemMetrics( SM_CXVIRTUALSCREEN );
|
|
if( !Result )
|
|
Result= GetSystemMetrics( SM_CXSCREEN );
|
|
break;
|
|
|
|
case SM_CYSCREEN:
|
|
Result= GetSystemMetrics( SM_CYVIRTUALSCREEN );
|
|
if( !Result )
|
|
Result= GetSystemMetrics( SM_CYSCREEN );
|
|
break;
|
|
|
|
default:
|
|
Result= GetSystemMetrics( nIndex );
|
|
break;
|
|
}
|
|
|
|
return( Result );
|
|
}
|
|
|
|
VOID AdjustWindow(INT fAdjust)
|
|
{
|
|
REGISTER t;
|
|
RECT rect;
|
|
BOOL bDiffLevel = FALSE;
|
|
RECT rectGame, rectHelp;
|
|
|
|
// an extra check
|
|
if (!hwndMain)
|
|
return;
|
|
|
|
dypAdjust = dypCaption;
|
|
|
|
if (FMenuOn())
|
|
{
|
|
// dypMenu is initialized to GetSystemMetrics(SM_CYMENU) + 1,
|
|
// which is the height of one menu line
|
|
dypAdjust += dypMenu;
|
|
|
|
// If the menu extends on two lines (because of the large-size
|
|
// font the user has chosen for the menu), increase the size
|
|
// of the window.
|
|
|
|
// The two menus : "Game" and "Help" are on the same line, if
|
|
// their enclosing rectangles top match. In that case, we don't
|
|
// need to extend the window size.
|
|
// If the tops do not match, that means they are on two lines.
|
|
// In that case, extend the size of the window by size of
|
|
// one menu line.
|
|
|
|
if (hMenu && GetMenuItemRect(hwndMain, hMenu, 0, &rectGame) &&
|
|
GetMenuItemRect(hwndMain, hMenu, 1, &rectHelp))
|
|
{
|
|
if (rectGame.top != rectHelp.top)
|
|
{
|
|
dypAdjust += dypMenu;
|
|
bDiffLevel = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
dxWindow = dxBlk * xBoxMac + dxGridOff + dxRightSpace;
|
|
dyWindow = dyBlk * yBoxMac + dyGridOff + dyBottomSpace;
|
|
|
|
if ((t = Preferences.xWindow+dxWindow - OurGetSystemMetrics(SM_CXSCREEN)) > 0)
|
|
{
|
|
fAdjust |= fResize;
|
|
Preferences.xWindow -= t;
|
|
}
|
|
|
|
if ((t = Preferences.yWindow+dyWindow - OurGetSystemMetrics(SM_CYSCREEN)) > 0)
|
|
{
|
|
fAdjust |= fResize;
|
|
Preferences.yWindow -= t;
|
|
}
|
|
|
|
if (!bInitMinimized)
|
|
{
|
|
if (fAdjust & fResize)
|
|
{
|
|
MoveWindow(hwndMain, Preferences.xWindow, Preferences.yWindow,
|
|
dxWindow+dxpBorder, dyWindow + dypAdjust, fTrue);
|
|
}
|
|
|
|
// after the window is adjusted, the "Game" and "Help" may move to the
|
|
// same line creating extra space at the bottom. so check again!
|
|
|
|
if (bDiffLevel && hMenu && GetMenuItemRect(hwndMain, hMenu, 0, &rectGame) &&
|
|
GetMenuItemRect(hwndMain, hMenu, 1, &rectHelp))
|
|
{
|
|
if (rectGame.top == rectHelp.top)
|
|
{
|
|
dypAdjust -= dypMenu;
|
|
MoveWindow(hwndMain, Preferences.xWindow, Preferences.yWindow,
|
|
dxWindow+dxpBorder, dyWindow + dypAdjust, fTrue);
|
|
}
|
|
}
|
|
|
|
if (fAdjust & fDisplay)
|
|
{
|
|
SetRect(&rect, 0, 0, dxWindow, dyWindow);
|
|
InvalidateRect(hwndMain, &rect, fTrue);
|
|
}
|
|
|
|
|
|
}
|
|
}
|