9 TCHAR szHelpPath
[MAX_PATH
];
23 DWORD dwOptions
= OPTION_THREE_CARDS
;
27 DWORD dwWasteTreshold
;
30 UINT_PTR PlayTimer
= 0;
34 typedef struct _CardBack
41 } CARDBACK
, *PCARDBACK
;
43 LRESULT CALLBACK
WndProc (HWND hwnd
, UINT iMsg
, WPARAM wParam
, LPARAM lParam
);
45 void MakePath(TCHAR
*szDest
, UINT nDestLen
, const TCHAR
*szExt
)
49 ptr
= szDest
+ GetModuleFileName(GetModuleHandle(0), szDest
, nDestLen
) - 1;
51 lstrcpy(ptr
+ 1, szExt
);
54 VOID
LoadSettings(VOID
)
61 if (RegCreateKeyEx(HKEY_CURRENT_USER
,
62 _T("Software\\ReactOS\\Solitaire"),
65 REG_OPTION_NON_VOLATILE
,
72 dwSize
= sizeof(DWORD
);
80 dwSize
= sizeof(DWORD
);
87 SolWnd
.SetBackCardIdx(dwBack
);
92 VOID
SaveSettings(VOID
)
98 if (RegCreateKeyEx(HKEY_CURRENT_USER
,
99 _T("Software\\ReactOS\\Solitaire"),
102 REG_OPTION_NON_VOLATILE
,
113 (CONST BYTE
*)&dwOptions
,
116 dwBack
= SolWnd
.GetBackCardIdx();
121 (CONST BYTE
*)&dwBack
,
127 // Returns 0 for no points, 1 for Standard and 2 for Vegas
128 int GetScoreMode(void)
130 if ((dwOptions
& OPTION_SCORE_STD
) && (dwOptions
& OPTION_SCORE_VEGAS
))
135 if (dwOptions
& OPTION_SCORE_STD
)
140 if (dwOptions
& OPTION_SCORE_VEGAS
)
148 void UpdateStatusBar(void)
150 TCHAR szStatusText
[128];
151 TCHAR szTempText
[64];
153 ZeroMemory(szStatusText
, sizeof(szStatusText
) / sizeof(TCHAR
));
155 if (GetScoreMode() != SCORE_NONE
)
157 _stprintf(szStatusText
, szScore
, lScore
);
158 _tcscat(szStatusText
, _T(" "));
161 if (dwOptions
& OPTION_SHOW_TIME
)
163 _stprintf(szTempText
, szTime
, dwTime
);
164 _tcscat(szStatusText
, szTempText
);
167 SendMessage(hwndStatus
, SB_SETTEXT
, 0 | SBT_NOBORDERS
, (LPARAM
)(LPTSTR
)szStatusText
);
170 void SetPlayTimer(void)
172 if (dwOptions
& OPTION_SHOW_TIME
)
176 PlayTimer
= SetTimer(hwndMain
, IDT_PLAYTIMER
, 1000, NULL
);
184 int WINAPI
_tWinMain(HINSTANCE hInst
, HINSTANCE hPrev
, LPTSTR szCmdLine
, int iCmdShow
)
189 INITCOMMONCONTROLSEX ice
;
194 // Load application title
195 LoadString(hInst
, IDS_SOL_NAME
, szAppName
, sizeof(szAppName
) / sizeof(szAppName
[0]));
196 // Load MsgBox() texts here to avoid loading them many times later
197 LoadString(hInst
, IDS_SOL_ABOUT
, MsgAbout
, sizeof(MsgAbout
) / sizeof(MsgAbout
[0]));
198 LoadString(hInst
, IDS_SOL_QUIT
, MsgQuit
, sizeof(MsgQuit
) / sizeof(MsgQuit
[0]));
199 LoadString(hInst
, IDS_SOL_WIN
, MsgWin
, sizeof(MsgWin
) / sizeof(MsgWin
[0]));
200 LoadString(hInst
, IDS_SOL_DEAL
, MsgDeal
, sizeof(MsgDeal
) / sizeof(MsgDeal
[0]));
202 LoadString(hInst
, IDS_SOL_SCORE
, szScore
, sizeof(szScore
) / sizeof(TCHAR
));
203 LoadString(hInst
, IDS_SOL_TIME
, szTime
, sizeof(szTime
) / sizeof(TCHAR
));
205 //Window class for the main application parent window
206 wndclass
.style
= 0;//CS_HREDRAW | CS_VREDRAW;
207 wndclass
.lpfnWndProc
= WndProc
;
208 wndclass
.cbClsExtra
= 0;
209 wndclass
.cbWndExtra
= 0;
210 wndclass
.hInstance
= hInst
;
211 wndclass
.hIcon
= LoadIcon (hInst
, MAKEINTRESOURCE(IDI_SOLITAIRE
));
212 wndclass
.hCursor
= LoadCursor (NULL
, IDC_ARROW
);
213 wndclass
.hbrBackground
= (HBRUSH
)NULL
;
214 wndclass
.lpszMenuName
= MAKEINTRESOURCE(IDR_MENU1
);
215 wndclass
.lpszClassName
= szAppName
;
217 RegisterClass(&wndclass
);
219 ice
.dwSize
= sizeof(ice
);
220 ice
.dwICC
= ICC_BAR_CLASSES
;
221 InitCommonControlsEx(&ice
);
223 srand((unsigned)GetTickCount());//timeGetTime());
229 dwPrevMode
= GetScoreMode();
231 //Construct the path to our help file
232 MakePath(szHelpPath
, MAX_PATH
, _T(".hlp"));
234 hwnd
= CreateWindow(szAppName
, // window class name
235 szAppName
, // window caption
237 ,//|WS_CLIPCHILDREN, // window style
238 CW_USEDEFAULT
, // initial x position
239 CW_USEDEFAULT
, // initial y position
240 0, // The real size will be computed in WndProc through WM_GETMINMAXINFO
241 0, // The real size will be computed in WndProc through WM_GETMINMAXINFO
242 NULL
, // parent window handle
243 NULL
, // use window class menu
244 hInst
, // program instance handle
245 NULL
); // creation parameters
251 ShowWindow(hwnd
, iCmdShow
);
254 hAccelTable
= LoadAccelerators(hInstance
, MAKEINTRESOURCE(IDR_ACCELERATOR1
));
256 while(GetMessage(&msg
, NULL
,0,0))
258 if(!TranslateAccelerator(hwnd
, hAccelTable
, &msg
))
260 TranslateMessage(&msg
);
261 DispatchMessage(&msg
);
271 INT_PTR CALLBACK
OptionsDlgProc(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
278 CheckRadioButton(hDlg
, IDC_OPT_DRAWONE
, IDC_OPT_DRAWTHREE
,
279 (dwOptions
& OPTION_THREE_CARDS
) ? IDC_OPT_DRAWTHREE
: IDC_OPT_DRAWONE
);
283 (dwOptions
& OPTION_SHOW_STATUS
) ? BST_CHECKED
: BST_UNCHECKED
);
287 (dwOptions
& OPTION_SHOW_TIME
) ? BST_CHECKED
: BST_UNCHECKED
);
291 (dwOptions
& OPTION_KEEP_SCORE
) ? BST_CHECKED
: BST_UNCHECKED
);
293 hCtrl
= GetDlgItem(hDlg
, IDC_OPT_KEEPSCORE
);
295 if (GetScoreMode() == SCORE_NONE
)
297 CheckRadioButton(hDlg
, IDC_OPT_STANDARD
, IDC_OPT_NOSCORE
, IDC_OPT_NOSCORE
);
298 EnableWindow(hCtrl
, FALSE
);
300 else if (GetScoreMode() == SCORE_STD
)
302 CheckRadioButton(hDlg
, IDC_OPT_STANDARD
, IDC_OPT_NOSCORE
, IDC_OPT_STANDARD
);
303 EnableWindow(hCtrl
, FALSE
);
305 else if (GetScoreMode() == SCORE_VEGAS
)
307 CheckRadioButton(hDlg
, IDC_OPT_STANDARD
, IDC_OPT_NOSCORE
, IDC_OPT_VEGAS
);
308 EnableWindow(hCtrl
, TRUE
);
313 switch(LOWORD(wParam
))
315 case IDC_OPT_NOSCORE
:
316 case IDC_OPT_STANDARD
:
318 hCtrl
= GetDlgItem(hDlg
, IDC_OPT_KEEPSCORE
);
319 if (wParam
== IDC_OPT_VEGAS
)
320 EnableWindow(hCtrl
, TRUE
);
322 EnableWindow(hCtrl
, FALSE
);
326 dwOptions
&= ~OPTION_THREE_CARDS
;
327 if (IsDlgButtonChecked(hDlg
, IDC_OPT_DRAWTHREE
) == BST_CHECKED
)
328 dwOptions
|= OPTION_THREE_CARDS
;
330 if (IsDlgButtonChecked(hDlg
, IDC_OPT_STATUSBAR
) == BST_CHECKED
)
331 dwOptions
|= OPTION_SHOW_STATUS
;
333 dwOptions
&= ~OPTION_SHOW_STATUS
;
335 if (IsDlgButtonChecked(hDlg
, IDC_OPT_SHOWTIME
) == BST_CHECKED
)
336 dwOptions
|= OPTION_SHOW_TIME
;
338 dwOptions
&= ~OPTION_SHOW_TIME
;
340 if (IsDlgButtonChecked(hDlg
, IDC_OPT_KEEPSCORE
) == BST_CHECKED
)
341 dwOptions
|= OPTION_KEEP_SCORE
;
343 dwOptions
&= ~OPTION_KEEP_SCORE
;
345 if (IsDlgButtonChecked(hDlg
, IDC_OPT_STANDARD
) == BST_CHECKED
)
347 dwOptions
|= OPTION_SCORE_STD
;
348 dwOptions
&= ~OPTION_SCORE_VEGAS
;
350 else if (IsDlgButtonChecked(hDlg
, IDC_OPT_VEGAS
) == BST_CHECKED
)
352 dwOptions
|= OPTION_SCORE_VEGAS
;
353 dwOptions
&= ~OPTION_SCORE_STD
;
355 else if (IsDlgButtonChecked(hDlg
, IDC_OPT_NOSCORE
) == BST_CHECKED
)
357 dwOptions
|= OPTION_SCORE_VEGAS
;
358 dwOptions
|= OPTION_SCORE_STD
;
363 EndDialog(hDlg
, TRUE
);
367 EndDialog(hDlg
, FALSE
);
375 VOID
ShowGameOptionsDlg(HWND hwnd
)
377 DWORD dwOldOptions
= dwOptions
;
378 RECT rcMain
, rcStatus
;
380 int iOldScoreMode
= GetScoreMode();
382 if (DialogBox(hInstance
, MAKEINTRESOURCE(IDD_OPTIONS
), hwnd
, OptionsDlgProc
))
384 if (((dwOldOptions
& OPTION_THREE_CARDS
) != (dwOptions
& OPTION_THREE_CARDS
)) ||
385 ((dwOldOptions
& OPTION_SHOW_TIME
) != (dwOptions
& OPTION_SHOW_TIME
)) ||
386 (iOldScoreMode
!= GetScoreMode()))
389 if ((dwOldOptions
& OPTION_SHOW_STATUS
) != (dwOptions
& OPTION_SHOW_STATUS
))
391 int nWidth
, nHeight
, nStatusHeight
;
393 GetClientRect(hwndMain
, &rcMain
);
394 nHeight
= rcMain
.bottom
- rcMain
.top
;
395 nWidth
= rcMain
.right
- rcMain
.left
;
397 if (dwOptions
& OPTION_SHOW_STATUS
)
401 ShowWindow(hwndStatus
, SW_SHOW
);
402 GetWindowRect(hwndStatus
, &rcStatus
);
403 nStatusHeight
= rcStatus
.bottom
- rcStatus
.top
;
404 MoveWindow(SolWnd
, 0, 0, nWidth
, nHeight
-nStatusHeight
, TRUE
);
405 MoveWindow(hwndStatus
, 0, nHeight
-nStatusHeight
, nWidth
, nHeight
, TRUE
);
407 // Force the window to process WM_GETMINMAXINFO again
408 GetWindowRect(hwndMain
, &rc
);
409 SetWindowPos(hwndMain
, NULL
, 0, 0, rc
.right
- rc
.left
, rc
.bottom
- rc
.top
, SWP_NOMOVE
| SWP_NOZORDER
);
413 ShowWindow(hwndStatus
, SW_HIDE
);
414 MoveWindow(SolWnd
, 0, 0, nWidth
, nHeight
, TRUE
);
422 CardImageWndProc(HWND hwnd
,
427 PCARDBACK pCardBack
= (PCARDBACK
)GetWindowLongPtr(hwnd
,
429 static WNDPROC hOldProc
= NULL
;
431 if (!hOldProc
&& pCardBack
)
432 hOldProc
= pCardBack
->hOldProc
;
441 HBRUSH hBrush
, hOldBrush
;
444 hdc
= BeginPaint(hwnd
, &ps
);
446 if (pCardBack
->bSelected
)
448 hPen
= CreatePen(PS_SOLID
, 2, RGB(0,0,0));
452 DWORD Face
= GetSysColor(COLOR_3DFACE
);
453 hPen
= CreatePen(PS_SOLID
, 2, Face
);
456 GetClientRect(hwnd
, &rc
);
457 hBrush
= (HBRUSH
)GetStockObject(NULL_BRUSH
);
458 hOldPen
= (HPEN
)SelectObject(hdc
, hPen
);
459 hOldBrush
= (HBRUSH
)SelectObject(hdc
, hBrush
);
470 CARDBACK_OPTIONS_WIDTH
,
471 CARDBACK_OPTIONS_HEIGHT
,
473 pCardBack
->hdcNum
* __cardwidth
,
479 SelectObject(hdc
, hOldPen
);
480 SelectObject(hdc
, hOldBrush
);
488 pCardBack
->bSelected
= pCardBack
->bSelected
? FALSE
: TRUE
;
492 return CallWindowProc(hOldProc
,
500 INT_PTR CALLBACK
CardBackDlgProc(HWND hDlg
,
505 static PCARDBACK pCardBacks
= NULL
;
512 SIZE_T size
= sizeof(CARDBACK
) * NUM_CARDBACKS
;
514 pCardBacks
= (PCARDBACK
)HeapAlloc(GetProcessHeap(),
518 for (i
= 0, c
= CARDBACK_START
; c
<= CARDBACK_END
; i
++, c
++)
520 pCardBacks
[i
].hSelf
= GetDlgItem(hDlg
, c
);
521 pCardBacks
[i
].bSelected
= FALSE
;
522 pCardBacks
[i
].hdcNum
= CARDBACK_RES_START
+ i
;
523 pCardBacks
[i
].imgNum
= i
+ 1;
524 pCardBacks
[i
].hOldProc
= (WNDPROC
)SetWindowLongPtr(pCardBacks
[i
].hSelf
,
526 (LONG_PTR
)CardImageWndProc
);
528 SetWindowLongPtr(pCardBacks
[i
].hSelf
,
530 (LONG_PTR
)&pCardBacks
[i
]);
537 if (LOWORD(wParam
) == IDOK
|| LOWORD(wParam
) == IDCANCEL
)
540 for (i
= 0; i
< NUM_CARDBACKS
; i
++)
542 if (pCardBacks
[i
].bSelected
)
544 num
= pCardBacks
[i
].imgNum
;
548 EndDialog(hDlg
, LOWORD(wParam
) == IDOK
? num
: FALSE
);
549 HeapFree(GetProcessHeap(), 0, pCardBacks
);
553 if (HIWORD(wParam
) == STN_CLICKED
)
557 for (i
= 0; i
< NUM_CARDBACKS
; i
++)
559 if (pCardBacks
[i
].hSelf
== (HWND
)lParam
)
561 pCardBacks
[i
].bSelected
= TRUE
;
564 pCardBacks
[i
].bSelected
= FALSE
;
566 GetClientRect(pCardBacks
[i
].hSelf
, &rc
);
567 InvalidateRect(pCardBacks
[i
].hSelf
, &rc
, TRUE
);
578 VOID
ShowDeckOptionsDlg(HWND hwnd
)
582 if ((cardBack
= DialogBox(hInstance
,
583 MAKEINTRESOURCE(IDD_CARDBACK
),
587 SolWnd
.SetBackCardIdx(CARDBACK_RES_START
+ (cardBack
- 1));
592 //-----------------------------------------------------------------------------
593 LRESULT CALLBACK
WndProc (HWND hwnd
, UINT iMsg
, WPARAM wParam
, LPARAM lParam
)
595 static int nWidth
, nHeight
, nStatusHeight
;
601 int parts
[] = { 150, -1 };
604 hwndStatus
= CreateStatusWindow(WS_CHILD
| WS_VISIBLE
| CCS_BOTTOM
| SBARS_SIZEGRIP
, _T("Ready"), hwnd
, 0);
606 //SendMessage(hwndStatus, SB_SIMPLE, (WPARAM)TRUE, 0);
608 SendMessage(hwndStatus
, SB_SETPARTS
, 2, (LPARAM
)parts
);
609 SendMessage(hwndStatus
, SB_SETTEXT
, 0 | SBT_NOBORDERS
, (LPARAM
)"");
611 SolWnd
.Create(hwnd
, WS_EX_CLIENTEDGE
, WS_CHILD
|WS_VISIBLE
, 0, 0, 0, 0);
615 // The status bar height is fixed and needed later in WM_SIZE and WM_GETMINMAXINFO
616 // Force the window to process WM_GETMINMAXINFO again
617 GetWindowRect(hwndStatus
, &rcStatus
);
618 nStatusHeight
= rcStatus
.bottom
- rcStatus
.top
;
620 // Hide status bar if options say so
621 if (!(dwOptions
& OPTION_SHOW_STATUS
))
623 ShowWindow(hwndStatus
, SW_HIDE
);
626 SetWindowPos(hwnd
, NULL
, 0, 0, 0, 0, SWP_NOMOVE
| SWP_NOZORDER
);
630 dwAppStartTime
= GetTickCount();
642 KillTimer(hwndMain
, IDT_PLAYTIMER
);
645 else if (dwOptions
& OPTION_SHOW_TIME
)
647 if (((dwTime
+ 1) % 10 == 0) && (GetScoreMode() == SCORE_STD
))
649 lScore
= lScore
>= 2 ? lScore
- 2 : 0;
659 nWidth
= LOWORD(lParam
);
660 nHeight
= HIWORD(lParam
);
662 if (dwOptions
& OPTION_SHOW_STATUS
)
664 MoveWindow(SolWnd
, 0, 0, nWidth
, nHeight
- nStatusHeight
, TRUE
);
665 MoveWindow(hwndStatus
, 0, nHeight
- nStatusHeight
, nWidth
, nStatusHeight
, TRUE
);
669 MoveWindow(SolWnd
, 0, 0, nWidth
, nHeight
, TRUE
);
671 //parts[0] = nWidth - 256;
672 //SendMessage(hwndStatus, SB_SETPARTS, 2, (LPARAM)parts);
675 case WM_GETMINMAXINFO
:
679 mmi
= (MINMAXINFO
*)lParam
;
680 mmi
->ptMinTrackSize
.x
= X_BORDER
+ NUM_ROW_STACKS
* (__cardwidth
+ X_ROWSTACK_BORDER
) + X_BORDER
;
681 mmi
->ptMinTrackSize
.y
= GetSystemMetrics(SM_CYCAPTION
) +
682 GetSystemMetrics(SM_CYMENU
) +
686 6 * yRowStackCardOffset
+
689 (dwOptions
& OPTION_SHOW_STATUS
? nStatusHeight
: 0);
694 switch(LOWORD(wParam
))
697 //simulate a button click on the new button..
702 ShowDeckOptionsDlg(hwnd
);
705 case IDM_GAME_OPTIONS
:
706 ShowGameOptionsDlg(hwnd
);
709 case IDM_HELP_CONTENTS
:
710 WinHelp(hwnd
, szHelpPath
, HELP_CONTENTS
, 0);//HELP_KEY, (DWORD)"How to play");
714 MessageBox(hwnd
, MsgAbout
, szAppName
, MB_OK
|MB_ICONINFORMATION
);
718 PostMessage(hwnd
, WM_CLOSE
, 0, 0);
725 if (fGameStarted
== false)
734 ret
= MessageBox(hwnd
, MsgQuit
, szAppName
, MB_YESNO
|MB_ICONQUESTION
);
737 WinHelp(hwnd
, szHelpPath
, HELP_QUIT
, 0);
744 return DefWindowProc (hwnd
, iMsg
, wParam
, lParam
);