519b534dc19c149d965b427e7de42d4d74e98acd
2 * PROJECT: Spider Solitaire
3 * LICENSE: See COPYING in top level directory
4 * FILE: base/applications/games/spider/spider.cpp
5 * PURPOSE: Window and message queue for Spider Solitaire
6 * PROGRAMMER: Gregor Schneider
14 TCHAR szHelpPath
[MAX_PATH
];
29 typedef struct _CardBack
36 } CARDBACK
, *PCARDBACK
;
38 LRESULT CALLBACK
WndProc (HWND hwnd
, UINT iMsg
, WPARAM wParam
, LPARAM lParam
);
40 void MakePath(TCHAR
*szDest
, UINT nDestLen
, const TCHAR
*szExt
)
44 ptr
= szDest
+ GetModuleFileName(GetModuleHandle(0), szDest
, nDestLen
) - 1;
46 lstrcpy(ptr
+ 1, szExt
);
49 INT_PTR CALLBACK
DifficultyDlgProc(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
54 CheckRadioButton(hDlg
, IDC_DIF_ONECOLOR
, IDC_DIF_FOURCOLORS
, IDC_DIF_ONECOLOR
);
58 switch(LOWORD(wParam
))
61 if (IsDlgButtonChecked(hDlg
, IDC_DIF_ONECOLOR
) == BST_CHECKED
)
62 dwDifficulty
= IDC_DIF_ONECOLOR
;
63 else if (IsDlgButtonChecked(hDlg
, IDC_DIF_TWOCOLORS
) == BST_CHECKED
)
64 dwDifficulty
= IDC_DIF_TWOCOLORS
;
65 else if (IsDlgButtonChecked(hDlg
, IDC_DIF_FOURCOLORS
) == BST_CHECKED
)
66 dwDifficulty
= IDC_DIF_FOURCOLORS
;
69 EndDialog(hDlg
, TRUE
);
73 EndDialog(hDlg
, FALSE
);
81 int WINAPI
_tWinMain(HINSTANCE hInst
, HINSTANCE hPrev
, LPTSTR szCmdLine
, int iCmdShow
)
86 INITCOMMONCONTROLSEX ice
;
91 /* Load application title */
92 LoadString(hInst
, IDS_SPI_NAME
, szAppName
, sizeof(szAppName
) / sizeof(szAppName
[0]));
93 /* Load MsgBox() texts here to avoid loading them many times later */
94 LoadString(hInst
, IDS_SPI_ABOUT
, MsgAbout
, sizeof(MsgAbout
) / sizeof(MsgAbout
[0]));
95 LoadString(hInst
, IDS_SPI_QUIT
, MsgQuit
, sizeof(MsgQuit
) / sizeof(MsgQuit
[0]));
96 LoadString(hInst
, IDS_SPI_WIN
, MsgWin
, sizeof(MsgWin
) / sizeof(MsgWin
[0]));
97 LoadString(hInst
, IDS_SPI_DEAL
, MsgDeal
, sizeof(MsgDeal
) / sizeof(MsgDeal
[0]));
99 /* Window class for the main application parent window */
101 wndclass
.lpfnWndProc
= WndProc
;
102 wndclass
.cbClsExtra
= 0;
103 wndclass
.cbWndExtra
= 0;
104 wndclass
.hInstance
= hInst
;
105 wndclass
.hIcon
= LoadIcon (hInst
, MAKEINTRESOURCE(IDI_SPIDER
));
106 wndclass
.hCursor
= LoadCursor (NULL
, IDC_ARROW
);
107 wndclass
.hbrBackground
= (HBRUSH
)NULL
;
108 wndclass
.lpszMenuName
= MAKEINTRESOURCE(IDR_MENU1
);
109 wndclass
.lpszClassName
= szAppName
;
111 RegisterClass(&wndclass
);
113 ice
.dwSize
= sizeof(ice
);
114 ice
.dwICC
= ICC_BAR_CLASSES
;
115 InitCommonControlsEx(&ice
);
117 srand((unsigned)GetTickCount());
121 /* Construct the path to our help file */
122 MakePath(szHelpPath
, MAX_PATH
, _T(".hlp"));
124 hwnd
= CreateWindow(szAppName
,
129 0, /*The real size will be computed in WndProc through WM_GETMINMAXINFO */
130 0, /* The real size will be computed in WndProc through WM_GETMINMAXINFO */
138 ShowWindow(hwnd
, iCmdShow
);
141 hAccelTable
= LoadAccelerators(hInstance
, MAKEINTRESOURCE(IDR_ACCELERATOR1
));
143 DialogBox(hInstance
, MAKEINTRESOURCE(IDD_DIFFICULTY
), hwnd
, DifficultyDlgProc
);
145 while (GetMessage(&msg
, NULL
,0,0))
147 if (!TranslateAccelerator(hwnd
, hAccelTable
, &msg
))
149 TranslateMessage(&msg
);
150 DispatchMessage(&msg
);
156 LRESULT CALLBACK
CardImageWndProc(HWND hwnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
158 PCARDBACK pCardBack
= (PCARDBACK
)GetWindowLongPtr(hwnd
, GWL_USERDATA
);
159 static WNDPROC hOldProc
= NULL
;
165 hOldProc
= pCardBack
->hOldProc
;
174 HBRUSH hBrush
, hOldBrush
;
177 hdc
= BeginPaint(hwnd
, &ps
);
179 if (pCardBack
->bSelected
)
181 hPen
= CreatePen(PS_SOLID
, 2, RGB(0,0,0));
185 DWORD Face
= GetSysColor(COLOR_3DFACE
);
186 hPen
= CreatePen(PS_SOLID
, 2, Face
);
189 GetClientRect(hwnd
, &rc
);
190 hBrush
= (HBRUSH
)GetStockObject(NULL_BRUSH
);
191 hOldPen
= (HPEN
)SelectObject(hdc
, hPen
);
192 hOldBrush
= (HBRUSH
)SelectObject(hdc
, hBrush
);
194 Rectangle(hdc
, rc
.left
+1, rc
.top
+1, rc
.right
, rc
.bottom
);
199 CARDBACK_OPTIONS_WIDTH
,
200 CARDBACK_OPTIONS_HEIGHT
,
202 pCardBack
->hdcNum
* __cardwidth
,
208 SelectObject(hdc
, hOldPen
);
209 SelectObject(hdc
, hOldBrush
);
217 pCardBack
->bSelected
= pCardBack
->bSelected
? FALSE
: TRUE
;
221 return CallWindowProc(hOldProc
, hwnd
, msg
, wParam
, lParam
);
225 INT_PTR CALLBACK
CardBackDlgProc(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
227 static PCARDBACK pCardBacks
= NULL
;
234 SIZE_T size
= sizeof(CARDBACK
) * NUM_CARDBACKS
;
236 pCardBacks
= (PCARDBACK
)HeapAlloc(GetProcessHeap(), 0, size
);
241 for (i
= 0, c
= CARDBACK_START
; c
<= CARDBACK_END
; i
++, c
++)
243 pCardBacks
[i
].hSelf
= GetDlgItem(hDlg
, c
);
244 pCardBacks
[i
].bSelected
= FALSE
;
245 pCardBacks
[i
].hdcNum
= CARDBACK_RES_START
+ i
;
246 pCardBacks
[i
].imgNum
= i
+ 1;
247 pCardBacks
[i
].hOldProc
= (WNDPROC
)SetWindowLongPtr(pCardBacks
[i
].hSelf
,
249 (LONG_PTR
)CardImageWndProc
);
251 SetWindowLongPtr(pCardBacks
[i
].hSelf
, GWL_USERDATA
, (LONG_PTR
)&pCardBacks
[i
]);
258 if (LOWORD(wParam
) == IDOK
|| LOWORD(wParam
) == IDCANCEL
)
261 for (i
= 0; i
< NUM_CARDBACKS
; i
++)
263 if (pCardBacks
[i
].bSelected
)
265 num
= pCardBacks
[i
].imgNum
;
269 EndDialog(hDlg
, LOWORD(wParam
) == IDOK
? num
: FALSE
);
270 HeapFree(GetProcessHeap(), 0, pCardBacks
);
274 if (HIWORD(wParam
) == STN_CLICKED
)
278 for (i
= 0; i
< NUM_CARDBACKS
; i
++)
280 pCardBacks
[i
].bSelected
= pCardBacks
[i
].hSelf
== (HWND
)lParam
;
282 GetClientRect(pCardBacks
[i
].hSelf
, &rc
);
283 InvalidateRect(pCardBacks
[i
].hSelf
, &rc
, TRUE
);
294 VOID
ShowDeckOptionsDlg(HWND hwnd
)
298 if ((cardBack
= DialogBox(hInstance
, MAKEINTRESOURCE(IDD_CARDBACK
), hwnd
, CardBackDlgProc
)))
300 SpiderWnd
.SetBackCardIdx(CARDBACK_RES_START
+ (cardBack
- 1));
305 LRESULT CALLBACK
WndProc (HWND hwnd
, UINT iMsg
, WPARAM wParam
, LPARAM lParam
)
307 static int nWidth
, nHeight
;
313 SpiderWnd
.Create(hwnd
, 0, WS_CHILD
| WS_VISIBLE
, 0, 0, 100, 100);
314 dwDifficulty
= IDC_DIF_ONECOLOR
;
317 SetWindowPos(hwnd
, NULL
, 0, 0, 0, 0, SWP_NOMOVE
| SWP_NOZORDER
);
319 dwAppStartTime
= GetTickCount();
329 nWidth
= LOWORD(lParam
);
330 nHeight
= HIWORD(lParam
);
332 MoveWindow(SpiderWnd
, 0, 0, nWidth
, nHeight
, TRUE
);
335 case WM_GETMINMAXINFO
:
339 mmi
= (MINMAXINFO
*)lParam
;
340 mmi
->ptMinTrackSize
.x
= NUM_STACKS
* __cardwidth
+ (NUM_STACKS
+ 3) * X_BORDER
+ 12; // Border left and right of 6px
341 mmi
->ptMinTrackSize
.y
= GetSystemMetrics(SM_CYCAPTION
) +
342 GetSystemMetrics(SM_CYMENU
) +
345 6 * yRowStackCardOffset
;
350 switch (LOWORD(wParam
))
357 ShowDeckOptionsDlg(hwnd
);
360 case IDM_HELP_CONTENTS
:
361 WinHelp(hwnd
, szHelpPath
, HELP_CONTENTS
, 0);//HELP_KEY, (DWORD)"How to play");
365 MessageBox(hwnd
, MsgAbout
, szAppName
, MB_OK
|MB_ICONINFORMATION
);
369 PostMessage(hwnd
, WM_CLOSE
, 0, 0);
376 if (fGameStarted
== false)
385 ret
= MessageBox(hwnd
, MsgQuit
, szAppName
, MB_YESNO
|MB_ICONQUESTION
);
388 WinHelp(hwnd
, szHelpPath
, HELP_QUIT
, 0);
394 return DefWindowProc (hwnd
, iMsg
, wParam
, lParam
);