/**************************************************************************** PROGRAM: WinMine (a.k.a. Mines, BombSquad, MineSweeper...) ****************************************************************************/ #define _WINDOWS #include #include #include // for HtmlHelp() #include // 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); } } }