📄 solitaire.cpp
字号:
#include <windows.h>
#include <commctrl.h>
#include <tchar.h>
#include <stdlib.h>
#include "resource.h"
#include "cardlib/cardlib.h"
#include "solitaire.h"
TCHAR szHelpPath[MAX_PATH];
DWORD dwAppStartTime;
HWND hwndMain;
HWND hwndStatus;
HINSTANCE hInstance;
TCHAR szAppName[128];
TCHAR MsgQuit[128];
TCHAR MsgAbout[128];
TCHAR MsgWin[128];
DWORD dwOptions = 8;
CardWindow SolWnd;
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);
}
VOID LoadSettings(VOID)
{
DWORD dwDisposition;
DWORD dwSize;
DWORD dwBack;
HKEY hKey;
if (RegCreateKeyEx(HKEY_CURRENT_USER,
_T("Software\\ReactOS\\Solitaire"),
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_READ,
NULL,
&hKey,
&dwDisposition))
return;
dwSize = sizeof(DWORD);
RegQueryValueEx(hKey,
_T("Options"),
NULL,
NULL,
(LPBYTE)&dwOptions,
&dwSize);
dwSize = sizeof(DWORD);
RegQueryValueEx(hKey,
_T("Back"),
NULL,
NULL,
(LPBYTE)&dwBack,
&dwSize);
SolWnd.SetBackCardIdx(dwBack);
RegCloseKey(hKey);
}
VOID SaveSettings(VOID)
{
DWORD dwDisposition;
DWORD dwBack;
HKEY hKey;
if (RegCreateKeyEx(HKEY_CURRENT_USER,
_T("Software\\ReactOS\\Solitaire"),
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_WRITE,
NULL,
&hKey,
&dwDisposition))
return;
RegSetValueEx(hKey,
_T("Options"),
0,
REG_DWORD,
(CONST BYTE *)&dwOptions,
sizeof(DWORD));
dwBack = SolWnd.GetBackCardIdx();
RegSetValueEx(hKey,
_T("Back"),
0,
REG_DWORD,
(CONST BYTE *)&dwBack,
sizeof(DWORD));
RegCloseKey(hKey);
}
//
// Main entry point
//
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_SOL_NAME, szAppName, sizeof(szAppName) / sizeof(szAppName[0]));
// Load MsgBox() texts here to avoid loading them many times later
LoadString(hInst, IDS_SOL_ABOUT, MsgAbout, sizeof(MsgAbout) / sizeof(MsgAbout[0]));
LoadString(hInst, IDS_SOL_QUIT, MsgQuit, sizeof(MsgQuit) / sizeof(MsgQuit[0]));
LoadString(hInst, IDS_SOL_WIN, MsgWin, sizeof(MsgWin) / sizeof(MsgWin[0]));
//Window class for the main application parent window
wndclass.style = 0;//CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInst;
wndclass.hIcon = LoadIcon (hInst, MAKEINTRESOURCE(IDI_SOLITAIRE));
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());//timeGetTime());
// InitCardLib();
LoadSettings();
//Construct the path to our help file
MakePath(szHelpPath, MAX_PATH, _T(".hlp"));
hwnd = CreateWindow(szAppName, // window class name
szAppName, // window caption
WS_OVERLAPPEDWINDOW
,//|WS_CLIPCHILDREN, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
600, // initial x size
450, // initial y size
NULL, // parent window handle
NULL, // use window class menu
hInst, // program instance handle
NULL); // creation parameters
hwndMain = hwnd;
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));
while(GetMessage(&msg, NULL,0,0))
{
if(!TranslateAccelerator(hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
SaveSettings();
return msg.wParam;
}
BOOL CALLBACK OptionsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
CheckRadioButton(hDlg, IDC_OPT_DRAWONE, IDC_OPT_DRAWTHREE,
(dwOptions & OPTION_THREE_CARDS) ? IDC_OPT_DRAWTHREE : IDC_OPT_DRAWONE);
CheckDlgButton(hDlg,
IDC_OPT_STATUSBAR,
(dwOptions & OPTION_SHOW_STATUS) ? BST_CHECKED : BST_UNCHECKED);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
dwOptions &= ~OPTION_THREE_CARDS;
if (IsDlgButtonChecked(hDlg, IDC_OPT_DRAWTHREE) == BST_CHECKED)
dwOptions |= OPTION_THREE_CARDS;
if (IsDlgButtonChecked(hDlg, IDC_OPT_STATUSBAR) == BST_CHECKED)
dwOptions |= OPTION_SHOW_STATUS;
else
dwOptions &= ~OPTION_SHOW_STATUS;
EndDialog(hDlg, TRUE);
return TRUE;
case IDCANCEL:
EndDialog(hDlg, FALSE);
return TRUE;
}
break;
}
return FALSE;
}
VOID ShowGameOptionsDlg(HWND hwnd)
{
DWORD dwOldOptions = dwOptions;
RECT rcMain, rcStatus;
int nWidth, nHeight, nStatusHeight;
if (DialogBox(hInstance, MAKEINTRESOURCE(IDD_OPTIONS), hwnd, OptionsDlgProc))
{
if ((dwOldOptions & OPTION_THREE_CARDS) != (dwOptions & OPTION_THREE_CARDS))
NewGame();
if ((dwOldOptions & OPTION_SHOW_STATUS) != (dwOptions & OPTION_SHOW_STATUS))
{
GetClientRect(hwndMain, &rcMain);
nHeight = rcMain.bottom - rcMain.top;
nWidth = rcMain.right - rcMain.left;
if (dwOptions & OPTION_SHOW_STATUS)
{
ShowWindow(hwndStatus, SW_SHOW);
GetWindowRect(hwndStatus, &rcStatus);
nStatusHeight = rcStatus.bottom - rcStatus.top;
MoveWindow(SolWnd, 0, 0, nWidth, nHeight-nStatusHeight, TRUE);
MoveWindow(hwndStatus, 0, nHeight-nStatusHeight, nWidth, nHeight, TRUE);
}
else
{
ShowWindow(hwndStatus, SW_HIDE);
MoveWindow(SolWnd, 0, 0, nWidth, nHeight, TRUE);
}
}
}
}
LRESULT CALLBACK
CardImageWndProc(HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -