Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402/* * PROJECT: Spider Solitaire * LICENSE: See COPYING in top level directory * FILE: base/applications/games/spider/spider.cpp * PURPOSE: Window and message queue for Spider Solitaire * PROGRAMMER: Gregor Schneider */
#include "spider.h"
#include <commctrl.h>#include <shellapi.h>#include <tchar.h>
TCHAR szHelpPath[MAX_PATH];
DWORD dwAppStartTime;HWND hwndMain;HINSTANCE hInstance;
TCHAR szAppName[128];TCHAR MsgQuit[128];TCHAR MsgAbout[128];TCHAR MsgWin[128];TCHAR MsgDeal[128];DWORD dwDifficulty;
CardWindow SpiderWnd;
typedef struct _CardBack{ HWND hSelf; WNDPROC hOldProc; INT hdcNum; INT imgNum; BOOL bSelected;} CARDBACK, *PCARDBACK;
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);
void MakePath(TCHAR *szDest, UINT nDestLen, const TCHAR *szExt){ TCHAR *ptr;
ptr = szDest + GetModuleFileName(GetModuleHandle(0), szDest, nDestLen) - 1; while(*ptr-- != '.'); lstrcpy(ptr + 1, szExt);}
INT_PTR CALLBACK DifficultyDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ switch (uMsg) { case WM_INITDIALOG: CheckRadioButton(hDlg, IDC_DIF_ONECOLOR, IDC_DIF_FOURCOLORS, IDC_DIF_ONECOLOR); return TRUE;
case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: if (IsDlgButtonChecked(hDlg, IDC_DIF_ONECOLOR) == BST_CHECKED) dwDifficulty = IDC_DIF_ONECOLOR; else if (IsDlgButtonChecked(hDlg, IDC_DIF_TWOCOLORS) == BST_CHECKED) dwDifficulty = IDC_DIF_TWOCOLORS; else if (IsDlgButtonChecked(hDlg, IDC_DIF_FOURCOLORS) == BST_CHECKED) dwDifficulty = IDC_DIF_FOURCOLORS;
NewGame(); EndDialog(hDlg, TRUE); return TRUE;
case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; } break; } return FALSE;}
int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR szCmdLine, int iCmdShow){ HWND hwnd; MSG msg; WNDCLASS wndclass; INITCOMMONCONTROLSEX ice; HACCEL hAccelTable;
hInstance = hInst;
/* Load application title */ LoadString(hInst, IDS_SPI_NAME, szAppName, sizeof(szAppName) / sizeof(szAppName[0])); /* Load MsgBox() texts here to avoid loading them many times later */ LoadString(hInst, IDS_SPI_ABOUT, MsgAbout, sizeof(MsgAbout) / sizeof(MsgAbout[0])); LoadString(hInst, IDS_SPI_QUIT, MsgQuit, sizeof(MsgQuit) / sizeof(MsgQuit[0])); LoadString(hInst, IDS_SPI_WIN, MsgWin, sizeof(MsgWin) / sizeof(MsgWin[0])); LoadString(hInst, IDS_SPI_DEAL, MsgDeal, sizeof(MsgDeal) / sizeof(MsgDeal[0]));
/* Window class for the main application parent window */ wndclass.style = 0; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInst; wndclass.hIcon = LoadIcon (hInst, MAKEINTRESOURCE(IDI_SPIDER)); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)NULL; wndclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); wndclass.lpszClassName = szAppName;
RegisterClass(&wndclass);
ice.dwSize = sizeof(ice); ice.dwICC = ICC_BAR_CLASSES; InitCommonControlsEx(&ice);
srand((unsigned)GetTickCount());
/* InitCardLib(); */
/* Construct the path to our help file */ MakePath(szHelpPath, MAX_PATH, _T(".hlp"));
hwnd = CreateWindow(szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 0, /*The real size will be computed in WndProc through WM_GETMINMAXINFO */ 0, /* The real size will be computed in WndProc through WM_GETMINMAXINFO */ NULL, NULL, hInst, NULL);
hwndMain = hwnd;
ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd);
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIFFICULTY), hwnd, DifficultyDlgProc);
while (GetMessage(&msg, NULL,0,0)) { if (!TranslateAccelerator(hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam;}
LRESULT CALLBACK CardImageWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){ PCARDBACK pCardBack = (PCARDBACK)GetWindowLongPtr(hwnd, GWLP_USERDATA); static WNDPROC hOldProc = NULL;
if (!pCardBack) return FALSE;
if (!hOldProc) hOldProc = pCardBack->hOldProc;
switch (msg) { case WM_PAINT: { HDC hdc; PAINTSTRUCT ps; HPEN hPen, hOldPen; HBRUSH hBrush, hOldBrush; RECT rc;
hdc = BeginPaint(hwnd, &ps);
if (pCardBack->bSelected) { hPen = CreatePen(PS_SOLID, 2, RGB(0,0,0)); } else { DWORD Face = GetSysColor(COLOR_3DFACE); hPen = CreatePen(PS_SOLID, 2, Face); }
GetClientRect(hwnd, &rc); hBrush = (HBRUSH)GetStockObject(NULL_BRUSH); hOldPen = (HPEN)SelectObject(hdc, hPen); hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
Rectangle(hdc, rc.left+1, rc.top+1, rc.right, rc.bottom);
StretchBlt(hdc, 2, 2, CARDBACK_OPTIONS_WIDTH, CARDBACK_OPTIONS_HEIGHT, __hdcCardBitmaps, pCardBack->hdcNum * __cardwidth, 0, __cardwidth, __cardheight, SRCCOPY);
SelectObject(hdc, hOldPen); SelectObject(hdc, hOldBrush);
EndPaint(hwnd, &ps);
break; }
case WM_LBUTTONDOWN: pCardBack->bSelected = pCardBack->bSelected ? FALSE : TRUE; break; }
return CallWindowProc(hOldProc, hwnd, msg, wParam, lParam);}
INT_PTR CALLBACK CardBackDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ static PCARDBACK pCardBacks = NULL;
switch (uMsg) { case WM_INITDIALOG: { INT i, c; SIZE_T size = sizeof(CARDBACK) * NUM_CARDBACKS;
pCardBacks = (PCARDBACK)HeapAlloc(GetProcessHeap(), 0, size);
if (!pCardBacks) return FALSE;
for (i = 0, c = CARDBACK_START; c <= CARDBACK_END; i++, c++) { pCardBacks[i].hSelf = GetDlgItem(hDlg, c); pCardBacks[i].bSelected = FALSE; pCardBacks[i].hdcNum = CARDBACK_RES_START + i; pCardBacks[i].imgNum = i + 1; pCardBacks[i].hOldProc = (WNDPROC)SetWindowLongPtr(pCardBacks[i].hSelf, GWLP_WNDPROC, (LONG_PTR)CardImageWndProc);
SetWindowLongPtr(pCardBacks[i].hSelf, GWLP_USERDATA, (LONG_PTR)&pCardBacks[i]); }
return TRUE; }
case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { INT i, num = 0; for (i = 0; i < NUM_CARDBACKS; i++) { if (pCardBacks[i].bSelected) { num = pCardBacks[i].imgNum; } }
EndDialog(hDlg, LOWORD(wParam) == IDOK ? num : FALSE); HeapFree(GetProcessHeap(), 0, pCardBacks); return TRUE; }
if (HIWORD(wParam) == STN_CLICKED) { INT i; RECT rc; for (i = 0; i < NUM_CARDBACKS; i++) { pCardBacks[i].bSelected = pCardBacks[i].hSelf == (HWND)lParam;
GetClientRect(pCardBacks[i].hSelf, &rc); InvalidateRect(pCardBacks[i].hSelf, &rc, TRUE); }
break; } }
return FALSE;}
VOID ShowDeckOptionsDlg(HWND hwnd){ INT cardBack;
if ((cardBack = DialogBox(hInstance, MAKEINTRESOURCE(IDD_CARDBACK), hwnd, CardBackDlgProc))) { SpiderWnd.SetBackCardIdx(CARDBACK_RES_START + (cardBack - 1)); SpiderWnd.Redraw(); }}
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam){ static int nWidth, nHeight;
switch (iMsg) { case WM_CREATE: { // For now, the Help dialog is disabled because of lacking of HTML Help support EnableMenuItem(GetMenu(hwnd), IDM_HELP_CONTENTS, MF_BYCOMMAND | MF_GRAYED);
SpiderWnd.Create(hwnd, 0, WS_CHILD | WS_VISIBLE, 0, 0, 100, 100); dwDifficulty = IDC_DIF_ONECOLOR; CreateSpider();
SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOZORDER);
dwAppStartTime = GetTickCount();
return 0; }
case WM_DESTROY: PostQuitMessage(0); return 0;
case WM_SIZE: nWidth = LOWORD(lParam); nHeight = HIWORD(lParam);
MoveWindow(SpiderWnd, 0, 0, nWidth, nHeight, TRUE); return 0;
case WM_GETMINMAXINFO: { MINMAXINFO *mmi;
mmi = (MINMAXINFO *)lParam; mmi->ptMinTrackSize.x = NUM_STACKS * __cardwidth + (NUM_STACKS + 3) * X_BORDER + 12; // Border left and right of 6px mmi->ptMinTrackSize.y = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYMENU) + 2 * Y_BORDER + 3 * __cardheight + 6 * yRowStackCardOffset; return 0; }
case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_GAME_NEW: NewGame(); return 0;
case IDM_GAME_DECK: ShowDeckOptionsDlg(hwnd); return 0;
case IDM_HELP_CONTENTS: WinHelp(hwnd, szHelpPath, HELP_CONTENTS, 0);//HELP_KEY, (DWORD)"How to play"); return 0;
case IDM_HELP_ABOUT: ShellAbout(hwnd, szAppName, MsgAbout, LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SPIDER))); return 0;
case IDM_GAME_EXIT: PostMessage(hwnd, WM_CLOSE, 0, 0); return 0; }
return 0;
case WM_CLOSE: if (fGameStarted == false) { DestroyWindow(hwnd); return 0; } else { int ret;
ret = MessageBox(hwnd, MsgQuit, szAppName, MB_YESNO|MB_ICONQUESTION); if (ret == IDYES) { WinHelp(hwnd, szHelpPath, HELP_QUIT, 0); DestroyWindow(hwnd); } } return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam);}