diff --git a/reactos/base/applications/games/solitaire/cardlib/cardbitmaps.cpp b/reactos/base/applications/games/solitaire/cardlib/cardbitmaps.cpp index 5b32ae4b550..4e16929d14a 100644 --- a/reactos/base/applications/games/solitaire/cardlib/cardbitmaps.cpp +++ b/reactos/base/applications/games/solitaire/cardlib/cardbitmaps.cpp @@ -263,7 +263,7 @@ HPALETTE MakePaletteFromCols(COLORREF cols[], int nNumColours) lp = (LOGPALETTE *)HeapAlloc( GetProcessHeap(), 0, sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * nNumColours); - lp->palNumEntries = nNumColours; + lp->palNumEntries = (WORD)nNumColours; lp->palVersion = 0x300; //copy the colours into the logical palette format diff --git a/reactos/base/applications/games/solitaire/cardlib/cardbutton.cpp b/reactos/base/applications/games/solitaire/cardlib/cardbutton.cpp index a66c3f273c1..dab2a23f803 100644 --- a/reactos/base/applications/games/solitaire/cardlib/cardbutton.cpp +++ b/reactos/base/applications/games/solitaire/cardlib/cardbutton.cpp @@ -334,7 +334,7 @@ int CardButton::OnLButtonUp(HWND hwnd, int x, int y) return 0; } -#define _countof(array) (sizeof(array)/sizeof(array[0])) +//#define _countof(array) (sizeof(array)/sizeof(array[0])) CardButton *CardWindow::CreateButton(int id, TCHAR *szText, UINT uStyle, bool fVisible, int x, int y, int width, int height) { diff --git a/reactos/base/applications/games/solitaire/cardlib/cardwindow.cpp b/reactos/base/applications/games/solitaire/cardlib/cardwindow.cpp index 48682ae9628..7f7c0228f10 100644 --- a/reactos/base/applications/games/solitaire/cardlib/cardwindow.cpp +++ b/reactos/base/applications/games/solitaire/cardlib/cardwindow.cpp @@ -735,6 +735,11 @@ void CardWindow::SetBackCardIdx(UINT uBackIdx) } +UINT CardWindow::GetBackCardIdx() +{ + return nBackCardIdx; +} + void CardWindow::PaintCardRgn(HDC hdc, int dx, int dy, int width, int height, int sx, int sy) { RECT rect; diff --git a/reactos/base/applications/games/solitaire/cardlib/cardwindow.h b/reactos/base/applications/games/solitaire/cardlib/cardwindow.h index 5a1b07a8430..fdfc1decdcc 100644 --- a/reactos/base/applications/games/solitaire/cardlib/cardwindow.h +++ b/reactos/base/applications/games/solitaire/cardlib/cardwindow.h @@ -46,6 +46,7 @@ public: void SetBackColor(COLORREF cr); COLORREF GetBackColor(); void SetBackCardIdx(UINT uBackIdx); + UINT GetBackCardIdx(); void SetBackImage(HBITMAP hBitmap); void EmptyStacks(void); diff --git a/reactos/base/applications/games/solitaire/lang/en-US.rc b/reactos/base/applications/games/solitaire/lang/en-US.rc index 47dc4401436..a545c9a8597 100644 --- a/reactos/base/applications/games/solitaire/lang/en-US.rc +++ b/reactos/base/applications/games/solitaire/lang/en-US.rc @@ -29,6 +29,20 @@ BEGIN END +IDD_CARDBACK DIALOGEX 6, 6, 221, 96 +CAPTION "Select Card Back" +FONT 8, "MS Shell Dlg" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT +BEGIN + CONTROL "", IDC_CARDBACK1, "Static", SS_NOTIFY, 4, 7, 50, 61 + CONTROL "", IDC_CARDBACK2, "Static", SS_NOTIFY, 58, 7, 50, 61 + CONTROL "", IDC_CARDBACK3, "Static", SS_NOTIFY, 112, 7, 50, 61 + CONTROL "", IDC_CARDBACK4, "Static", SS_NOTIFY, 166, 7, 50, 61 + DEFPUSHBUTTON "OK", IDOK, 104, 77, 54, 13 + PUSHBUTTON "Cancel", IDCANCEL, 162, 77, 54, 13 +END + + /* Strings */ STRINGTABLE @@ -48,7 +62,7 @@ BEGIN BEGIN MENUITEM "&Deal\tF2", IDM_GAME_NEW MENUITEM SEPARATOR - MENUITEM "De&ck...", IDM_GAME_DECK, GRAYED + MENUITEM "De&ck...", IDM_GAME_DECK MENUITEM "&Options...", IDM_GAME_OPTIONS MENUITEM SEPARATOR MENUITEM "&Exit", IDM_GAME_EXIT diff --git a/reactos/base/applications/games/solitaire/resource.h b/reactos/base/applications/games/solitaire/resource.h index 42d48dba6bb..62bce4264b9 100644 --- a/reactos/base/applications/games/solitaire/resource.h +++ b/reactos/base/applications/games/solitaire/resource.h @@ -20,6 +20,11 @@ #define IDC_OPT_DRAWTHREE 1202 #define IDC_OPT_SHOWTIME 1203 #define IDC_OPT_STATUSBAR 1204 +#define IDD_CARDBACK 1250 +#define IDC_CARDBACK1 1251 +#define IDC_CARDBACK2 1252 +#define IDC_CARDBACK3 1253 +#define IDC_CARDBACK4 1254 /* Strings */ #define IDS_SOL_NAME 1300 diff --git a/reactos/base/applications/games/solitaire/solitaire.cpp b/reactos/base/applications/games/solitaire/solitaire.cpp index d351d249c1e..dad967ff485 100644 --- a/reactos/base/applications/games/solitaire/solitaire.cpp +++ b/reactos/base/applications/games/solitaire/solitaire.cpp @@ -23,6 +23,15 @@ 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) @@ -38,10 +47,11 @@ VOID LoadSettings(VOID) { DWORD dwDisposition; DWORD dwSize; + DWORD dwBack; HKEY hKey; if (RegCreateKeyEx(HKEY_CURRENT_USER, - _T("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Solitaire"), + _T("Software\\ReactOS\\Solitaire"), 0, NULL, REG_OPTION_NON_VOLATILE, @@ -59,16 +69,26 @@ VOID LoadSettings(VOID) (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\\Microsoft\\Windows\\CurrentVersion\\Applets\\Solitaire"), + _T("Software\\ReactOS\\Solitaire"), 0, NULL, REG_OPTION_NON_VOLATILE, @@ -85,6 +105,14 @@ VOID SaveSettings(VOID) (CONST BYTE *)&dwOptions, sizeof(DWORD)); + dwBack = SolWnd.GetBackCardIdx(); + RegSetValueEx(hKey, + _T("Back"), + 0, + REG_DWORD, + (CONST BYTE *)&dwBack, + sizeof(DWORD)); + RegCloseKey(hKey); } @@ -138,13 +166,13 @@ int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, PSTR szCmdLine, int iCmdSh hwnd = CreateWindow(szAppName, // window class name szAppName, // window caption WS_OVERLAPPEDWINDOW - ,//|WS_CLIPCHILDREN, // window style + ,//|WS_CLIPCHILDREN, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position - CW_USEDEFAULT, // initial x size - CW_USEDEFAULT, // initial y size - NULL, // parent window handle - NULL, // use window class menu + 600, // initial x size + 450, // initial y size + NULL, // parent window handle + NULL, // use window class menu hInst, // program instance handle NULL); // creation parameters @@ -211,6 +239,176 @@ VOID ShowGameOptionsDlg(HWND hwnd) } } + +LRESULT CALLBACK +CardImageWndProc(HWND hwnd, + UINT msg, + WPARAM wParam, + LPARAM lParam) +{ + PCARDBACK pCardBack = (PCARDBACK)GetWindowLongPtr(hwnd, + GWL_USERDATA); + static WNDPROC hOldProc = NULL; + + if (!hOldProc && pCardBack) + 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); + + BitBlt(hdc, + 2, + 2, + __cardwidth, + __cardheight, + __hdcCardBitmaps, + pCardBack->hdcNum * __cardwidth, + 0, + 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); +} + + +BOOL 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); + + 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, + GWL_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++) + { + if (pCardBacks[i].hSelf == (HWND)lParam) + { + pCardBacks[i].bSelected = TRUE; + } + else + pCardBacks[i].bSelected = FALSE; + + 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))) + { + SolWnd.SetBackCardIdx(CARDBACK_RES_START + (cardBack - 1)); + SolWnd.Redraw(); + } +} + //----------------------------------------------------------------------------- LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { @@ -272,7 +470,7 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) return 0; case IDM_GAME_DECK: - //ShowDeckOptionsDlg(hwnd); + ShowDeckOptionsDlg(hwnd); return 0; case IDM_GAME_OPTIONS: diff --git a/reactos/base/applications/games/solitaire/solitaire.h b/reactos/base/applications/games/solitaire/solitaire.h index 1e1560cbe05..dbe2ed66ad2 100644 --- a/reactos/base/applications/games/solitaire/solitaire.h +++ b/reactos/base/applications/games/solitaire/solitaire.h @@ -6,6 +6,10 @@ extern TCHAR szAppName[]; extern bool fGameStarted; #define OPTION_THREE_CARDS 8 +#define CARDBACK_START IDC_CARDBACK1 +#define CARDBACK_END IDC_CARDBACK4 +#define NUM_CARDBACKS (CARDBACK_END - CARDBACK_START + 1) +#define CARDBACK_RES_START 53 extern DWORD dwOptions;