imported catch-22 sol clone with authors permission Added: trunk/rosapps/games/solitaire/ Added: trunk/rosapps/games/solitaire/ReadMe.txt Added: trunk/rosapps/games/solitaire/cardlib/ Added: trunk/rosapps/games/solitaire/cardlib/card.h Added: trunk/rosapps/games/solitaire/cardlib/cardbitmaps.cpp Added: trunk/rosapps/games/solitaire/cardlib/cardbutton.cpp Added: trunk/rosapps/games/solitaire/cardlib/cardbutton.cpp.bak Added: trunk/rosapps/games/solitaire/cardlib/cardbutton.h Added: trunk/rosapps/games/solitaire/cardlib/cardcolor.cpp Added: trunk/rosapps/games/solitaire/cardlib/cardcolor.h Added: trunk/rosapps/games/solitaire/cardlib/cardcount.cpp Added: trunk/rosapps/games/solitaire/cardlib/cardcount.h Added: trunk/rosapps/games/solitaire/cardlib/cardlib.cpp Added: trunk/rosapps/games/solitaire/cardlib/cardlib.h Added: trunk/rosapps/games/solitaire/cardlib/cardregion.cpp Added: trunk/rosapps/games/solitaire/cardlib/cardregion.h Added: trunk/rosapps/games/solitaire/cardlib/cardrgndraw.cpp Added: trunk/rosapps/games/solitaire/cardlib/cardrgnmouse.cpp Added: trunk/rosapps/games/solitaire/cardlib/cardrgnmouse.cpp.bak Added: trunk/rosapps/games/solitaire/cardlib/cardstack.cpp Added: trunk/rosapps/games/solitaire/cardlib/cardstack.h Added: trunk/rosapps/games/solitaire/cardlib/cardwindow.cpp Added: trunk/rosapps/games/solitaire/cardlib/cardwindow.h Added: trunk/rosapps/games/solitaire/cardlib/dropzone.cpp Added: trunk/rosapps/games/solitaire/cardlib/dropzone.h Added: trunk/rosapps/games/solitaire/cardlib/globals.h Added: trunk/rosapps/games/solitaire/icon1.ico Added: trunk/rosapps/games/solitaire/makefile Added: trunk/rosapps/games/solitaire/resource.h Added: trunk/rosapps/games/solitaire/sol.rc Added: trunk/rosapps/games/solitaire/solcreate.cpp Added: trunk/rosapps/games/solitaire/solgame.cpp Added: trunk/rosapps/games/solitaire/solitaire.cpp Added: trunk/rosapps/games/solitaire/solitaire.h _____
Added: trunk/rosapps/games/solitaire/ReadMe.txt --- trunk/rosapps/games/solitaire/ReadMe.txt 2005-03-10 03:50:43 UTC (rev 13903) +++ trunk/rosapps/games/solitaire/ReadMe.txt 2005-03-10 04:04:27 UTC (rev 13904) @@ -0,0 +1,22 @@
+Solitaire for ReactOS + +/***************************************** +A complete working example of the CardLib +card-game library. + +Freeware +Copyright J Brown 2001 + +Updates at http://www.catch22.net + +******************************************/ + +The author has given permission to use these sources +under Public Domain. Do what thou will but please give +credit where credit is due. + +If you wish to use cardlib to write another card game +for ReactOS please make cardlib a static lib. + +-sedwards + _____
Added: trunk/rosapps/games/solitaire/cardlib/card.h --- trunk/rosapps/games/solitaire/cardlib/card.h 2005-03-10 03:50:43 UTC (rev 13903) +++ trunk/rosapps/games/solitaire/cardlib/card.h 2005-03-10 04:04:27 UTC (rev 13904) @@ -0,0 +1,105 @@
+// +// CardLib - Card class +// +// Freeware +// Copyright J Brown 2001 +// + +#ifndef _CARD_INCLUDED +#define _CARD_INCLUDED + +enum eSuit { Clubs = 0, Diamonds = 1, Hearts = 2, Spades = 3 }; +enum eValue { Ace = 1, Two = 2, Three = 3, Four = 4, Five = 5, Six = 6, Seven = 7, + Eight = 8, Nine = 9, Ten = 10, Jack = 11, Queen = 12, King = 13 }; + +inline int MAKE_CARD(int Value, int Suit) +{ + if(Value < 1) Value = 1; + if(Value == 14) Value = 1; + if(Value > 13) Value = 13; + + if(Suit < 0) Suit = 0; + if(Suit > 3) Suit = 3; + + return ((Value - 1) * 4 + Suit); +} + +class Card +{ + friend class CardStack; + +public: + + Card() + { + nValue = 0; //ace of spades by default + fFaceUp = true; + } + + Card(int value, int suit) //specify a face value [1-13] and suit [0-3] + { + nValue = MAKE_CARD(value, suit); + fFaceUp = true; + } + + Card(int index) //specify a 0-51 index + { + if(index < 0) index = 0; + if(index > 51) index = 51; + + nValue = index; + fFaceUp = true; + } + + int Suit() const + { + return (nValue % 4); + } + + int LoVal() const + { + return (nValue / 4) + 1; + } + + int HiVal() const + { + return ((nValue < 4) ? 14 : (nValue / 4) + 1); + } + + int Idx() const //unique value (0-51 etc) + { + return nValue; + } + + bool FaceUp() const + { + return fFaceUp; + } + + bool FaceDown() const + { + return !fFaceUp; + } + + void SetFaceUp(bool fTrue) + { + fFaceUp = fTrue; + } + + bool IsBlack() const + { + return Suit() == 0 || Suit() == 3; + } + + bool IsRed() const + { + return !IsBlack(); + } + +private: + + int nValue; + bool fFaceUp; +}; + +#endif _____
Added: trunk/rosapps/games/solitaire/cardlib/cardbitmaps.cpp --- trunk/rosapps/games/solitaire/cardlib/cardbitmaps.cpp 2005-03-10 03:50:43 UTC (rev 13903) +++ trunk/rosapps/games/solitaire/cardlib/cardbitmaps.cpp 2005-03-10 04:04:27 UTC (rev 13904) @@ -0,0 +1,281 @@
+// +// CardLib - Card bitmap support +// +// Freeware +// Copyright J Brown 2001 +// +#include <windows.h> +#include "globals.h" +#include "cardcolor.h" + +#ifndef __REACTOS__ +#pragma comment( lib, "..\CardLib\cards16.lib" ) + +extern "C" HINSTANCE WINAPI LoadLibrary16( PSTR ); +extern "C" void WINAPI FreeLibrary16( HINSTANCE ); +#endif + +#define NUMCARDBITMAPS (52+16) + +void PaintRect(HDC hdc, RECT *rect, COLORREF col); + +void LoadCardBitmapsFromLibrary(HINSTANCE hCardDll, int *pwidth, int *pheight) +{ + HBITMAP hBitmap; + HDC hdcCard; + HANDLE hOld; + int i, xpos; + int width, height; + BITMAP bmp; + + for(i = 0; i < NUMCARDBITMAPS; i++) + { + //convert into the range used by the cdt_xxx functions + int val; + + if(i < 52) val = (i % 4) * 13 + (i/4); + else val = i; + + hBitmap = LoadBitmap(hCardDll, MAKEINTRESOURCE(val + 1)); + GetObject(hBitmap, sizeof(bmp), &bmp); + + width = bmp.bmWidth; + height = bmp.bmHeight; + + if(i == 0) //if first time through, create BIG bitmap.. + { + HDC hdc = GetDC(0); + __hdcCardBitmaps = CreateCompatibleDC(hdc); + __hbmCardBitmaps = CreateCompatibleBitmap(hdc, width * NUMCARDBITMAPS, height); + SelectObject(__hdcCardBitmaps, __hbmCardBitmaps); + + hdcCard = CreateCompatibleDC(0); + + ReleaseDC(0, hdc); + } + + hOld = SelectObject(hdcCard, hBitmap); + BitBlt(__hdcCardBitmaps, i*width, 0, width, height, hdcCard, 0, 0, SRCCOPY); + SelectObject(hdcCard, hOld); + + //Now draw a black border around each card... + xpos = i*width; + MoveToEx(__hdcCardBitmaps, xpos+2, 0, 0); + LineTo(__hdcCardBitmaps, xpos+width - 3, 0); + LineTo(__hdcCardBitmaps, xpos+width - 1, 2); + LineTo(__hdcCardBitmaps, xpos+width - 1, height - 3); //vertical + LineTo(__hdcCardBitmaps, xpos+width - 3, height - 1); + LineTo(__hdcCardBitmaps, xpos+2, height - 1); + LineTo(__hdcCardBitmaps, xpos+0, height - 3); + LineTo(__hdcCardBitmaps, xpos+0, 2); + LineTo(__hdcCardBitmaps, xpos+2, 0); + + DeleteObject(hBitmap); + } + + DeleteDC(hdcCard); + + *pwidth = width; + *pheight = height; + +} + +void LoadCardBitmaps(void) +{ + HINSTANCE hCardDll; + + + //If Windows NT/2000/XP + if(GetVersion() < 0x80000000) + { + hCardDll = LoadLibrary("cards.dll"); + + if(hCardDll == 0) + { + MessageBox(0, "Error loading cards.dll (32bit)", "Shed", MB_OK | MB_ICONEXCLAMATION); + PostQuitMessage(0); + return; + } + + LoadCardBitmapsFromLibrary(hCardDll, &__cardwidth, &__cardheight); + + FreeLibrary(hCardDll); + } +#ifndef __REACTOS__ + //Else, Win9X + else + { + hCardDll = LoadLibrary16("cards.dll"); + + if(hCardDll == 0) + { + MessageBox(0, "Error loading cards.dll (16bit)", "Shed", MB_OK | MB_ICONEXCLAMATION); + PostQuitMessage(0); + return; + } + + LoadCardBitmapsFromLibrary(hCardDll, &__cardwidth, &__cardheight); + + FreeLibrary16(hCardDll); + } +#endif +} + +void FreeCardBitmaps() +{ + DeleteObject (__hbmCardBitmaps); + DeleteDC (__hdcCardBitmaps); +} +// +// Paint a checkered rectangle, with each alternate +// pixel being assigned a different colour +// +static void DrawCheckedRect(HDC hdc, RECT *rect, COLORREF fg, COLORREF bg) +{ + static WORD wCheckPat[8] = + { + 0xaaaa, 0x5555, 0xaaaa, 0x5555, 0xaaaa, 0x5555, 0xaaaa, 0x5555 + }; + + HBITMAP hbmp; + HBRUSH hbr, hbrold; + COLORREF fgold, bgold; + + hbmp = CreateBitmap(8, 8, 1, 1, wCheckPat); + hbr = CreatePatternBrush(hbmp); + + //UnrealizeObject(hbr); + + SetBrushOrgEx(hdc, rect->left, rect->top, 0); + + hbrold = (HBRUSH)SelectObject(hdc, hbr); + + fgold = SetTextColor(hdc, fg); + bgold = SetBkColor(hdc, bg); + + PatBlt(hdc, rect->left, rect->top, + rect->right - rect->left, + rect->bottom - rect->top, + PATCOPY); + + SetBkColor(hdc, bgold); + SetTextColor(hdc, fgold); + + SelectObject(hdc, hbrold); + DeleteObject(hbr); + DeleteObject(hbmp); +} + +void GetSinkCols(COLORREF crBase, COLORREF *fg, COLORREF *bg, COLORREF *sh1, COLORREF *sh2) +{ + if(bg) *bg = crBase; + if(fg) *fg = ColorScaleRGB(crBase, RGB(255,255,255), 0.2);//RGB(49, 99, 140); + if(sh1) *sh1 = ColorScaleRGB(crBase, RGB(0,0,0), 0.4); + if(sh2) *sh2 = ColorScaleRGB(crBase, RGB(0,0,0), 0.2); +} + +HBITMAP CreateSinkBmp(HDC hdcCompat, HDC hdc, COLORREF col, int width, int height) +{ + HANDLE hold, hpold; + HBITMAP hbm = CreateCompatibleBitmap(hdcCompat, width, height); + + HPEN hpfg, hpbg, hpsh, hpsh2; + + RECT rect; + COLORREF fg, bg, shadow, shadow2; + + GetSinkCols(col, &fg, &bg, &shadow, &shadow2); + + hold = SelectObject(hdc, hbm); + + //fill with a solid base colour + SetRect(&rect, 0,0,width,height); + PaintRect(hdc, &rect, MAKE_PALETTERGB(bg)); + + //draw the outline + hpfg = CreatePen(PS_SOLID, 0, MAKE_PALETTERGB(fg)); + hpbg = CreatePen(PS_SOLID, 0, MAKE_PALETTERGB(bg)); + hpsh = CreatePen(PS_SOLID, 0, MAKE_PALETTERGB(shadow)); + hpsh2= CreatePen(PS_SOLID, 0, MAKE_PALETTERGB(shadow2)); + + hpold = SelectObject(hdc, hpsh); + MoveToEx(hdc, 2, 0, NULL); + LineTo (hdc, width-3,0); + LineTo (hdc, width-1, 2); + + SelectObject(hdc, hpold); + hpold = SelectObject(hdc, hpsh2); + LineTo (hdc, width-1, height-3); //vertical + LineTo (hdc, width-3, height-1); + LineTo (hdc, 2, height-1); + LineTo (hdc, 0, height-3); + SelectObject(hdc, hpold); + hpold = SelectObject(hdc, hpsh); + + //MoveToEx( hdc, 0, height-3,0); + LineTo (hdc, 0, 2); + LineTo (hdc, 2, 0); + + SelectObject(hdc, hpold); + + //draw the highlight (vertical) + hpold = SelectObject(hdc, hpfg); + MoveToEx(hdc, width - 2, 3, NULL); + LineTo (hdc, width - 2, height - 2); + + //(horz) + MoveToEx(hdc, width - 3, height-2, NULL); + LineTo (hdc, 3, height-2); + SelectObject(hdc, hpold); + + //draw the background + InflateRect(&rect, -2, -2); + DrawCheckedRect(hdc, &rect, MAKE_PALETTERGB(bg), MAKE_PALETTERGB(fg)); + + //overwrite the top-left background pixel + SetPixel(hdc, 2, 2, MAKE_PALETTERGB(bg)); + + DeleteObject(hpsh); + DeleteObject(hpsh2); + DeleteObject(hpfg); + DeleteObject(hpbg); + + + return hbm; +} + + + +void CopyColor(PALETTEENTRY *pe, COLORREF col) +{ + pe->peBlue = GetBValue(col); + pe->peGreen = GetGValue(col); + pe->peRed = GetRValue(col); + pe->peFlags = 0; +} + +HPALETTE MakePaletteFromCols(COLORREF cols[], int nNumColours) +{ + LOGPALETTE *lp; + HPALETTE hPalette; + + // Allocate memory for the logical palette + lp = (LOGPALETTE *)HeapAlloc( + GetProcessHeap(), 0, sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * nNumColours); + + lp->palNumEntries = nNumColours; + lp->palVersion = 0x300; + + //copy the colours into the logical palette format + for(int i = 0; i < nNumColours; i++) + { + CopyColor(&lp->palPalEntry[i], cols[i]); + } + + // create palette! + hPalette = CreatePalette(lp); + + HeapFree(GetProcessHeap(), 0, lp); + + return hPalette; +} _____
Added: trunk/rosapps/games/solitaire/cardlib/cardbutton.cpp --- trunk/rosapps/games/solitaire/cardlib/cardbutton.cpp 2005-03-10 03:50:43 UTC (rev 13903) +++ trunk/rosapps/games/solitaire/cardlib/cardbutton.cpp 2005-03-10 04:04:27 UTC (rev 13904) @@ -0,0 +1,489 @@
+// +// CardLib - CardButton class +// +// Freeware +// Copyright J Brown 2001 +// +#include <windows.h> +#include <tchar.h> + +#include "cardlib.h" +#include "cardwindow.h" +#include "cardbutton.h" +#include "cardcolor.h" + +HPALETTE UseNicePalette(HDC, HPALETTE); +void RestorePalette(HDC, HPALETTE); + +void PaintRect(HDC hdc, RECT *rect, COLORREF colour); + +CardButton::CardButton(CardWindow &parent, int Id, TCHAR *szText, UINT Style, bool visible, + int x, int y, int width, int height) + + : parentWnd(parent), id(Id), fVisible(visible), uStyle(Style), ButtonCallback(0) +{ + crText = RGB(255,255,255); + crBack = RGB(0, 128, 0); + + xadjust = 0; + yadjust = 0; + xjustify = 0; + yjustify = 0; + + fMouseDown = false; + fButtonDown = false; + + hIcon = 0; + + SetText(szText); + Move(x, y, width, height); + + mxlock = CreateMutex(0, FALSE, 0); + + hFont = 0; +} + +CardButton::~CardButton() +{ + CloseHandle(mxlock); +} + +void CardButton::DrawRect(HDC hdc, RECT *rect, bool fNormal) +{ + RECT fill; + + HANDLE hOld; + + HPEN hhi = CreatePen(0, 0, MAKE_PALETTERGB(crHighlight)); + HPEN hsh = CreatePen(0, 0, MAKE_PALETTERGB(crShadow)); + HPEN hbl = (HPEN)GetStockObject(BLACK_PEN); + + int x = rect->left; + int y = rect->top; + int width = rect->right-rect->left - 1; + int height = rect->bottom-rect->top - 1; + + SetRect(&fill, x+1, y+1, x+width-1, y+height-1); + + int one = 1; + + if(!fNormal) + { + x += width; + y += height; + width = -width; + height = -height; + one = -1; + OffsetRect(&fill, 1, 1); + } + + if(fNormal) + hOld = SelectObject(hdc, hhi); + else + hOld = SelectObject(hdc, hhi); + + MoveToEx(hdc, x, y+height, 0); + LineTo(hdc, x, y); + LineTo(hdc, x+width, y); + SelectObject(hdc, hOld); + + hOld = SelectObject(hdc, hbl); + LineTo(hdc, x+width, y+height); + LineTo(hdc, x-one, y+height); + SelectObject(hdc, hOld); + + hOld = SelectObject(hdc, hsh); + MoveToEx(hdc, x+one, y+height-one, 0); + LineTo(hdc, x+width-one, y+height-one); + LineTo(hdc, x+width-one, y); + SelectObject(hdc, hOld); + + PaintRect(hdc, &fill, MAKE_PALETTERGB(crBack)); + + DeleteObject(hhi); + DeleteObject(hsh); +} + +void CardButton::Clip(HDC hdc) +{ + if(fVisible == false) return; + + ExcludeClipRect(hdc, rect.left, rect.top, rect.right, rect.bottom); +} + +void CardButton::Draw(HDC hdc, bool fNormal) +{ + SIZE textsize; + int x, y; //text x, y + int ix, iy; //icon x, y + int iconwidth = 0; + + RECT cliprect; + + if(fVisible == 0) return; + + if(hFont == 0) + SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT)); + else + SelectObject(hdc, hFont); + + GetTextExtentPoint32(hdc, szText, lstrlen(szText), &textsize); + + if(hIcon) + { + x = rect.left + 32 + 8; + } + else + { + if(uStyle & CB_ALIGN_LEFT) + { + x = rect.left + iconwidth; + } + else if(uStyle & CB_ALIGN_RIGHT) + { + x = rect.left + (rect.right-rect.left-iconwidth-textsize.cx); + } + else //centered + { + x = rect.right - rect.left - iconwidth; + x = (x - textsize.cx) / 2; + x += rect.left + iconwidth; + } + } + + y = rect.bottom - rect.top; + y = (y - textsize.cy) / 2; + y += rect.top; + + //calc icon position.. + ix = rect.left + 4; + iy = rect.top + (rect.bottom-rect.top-32) / 2; + + //if button is pressed, then shift text + if(fNormal == false && (uStyle & CB_PUSHBUTTON)) + { + x += 1; + y += 1; + ix += 1; + iy += 1; + } + + SetRect(&cliprect, x, y, x+textsize.cx, y+textsize.cy); + ExcludeClipRect(hdc, x, y, x+textsize.cx, y+textsize.cy); + + // + // Calc icon pos + // + + if(hIcon) + { + ExcludeClipRect(hdc, ix, iy, ix + 32, iy + 32); + } + + if(uStyle & CB_PUSHBUTTON) + { + DrawRect(hdc, &rect, fNormal); + + SetBkColor(hdc, MAKE_PALETTERGB(crBack)); + SetTextColor(hdc, crText);//MAKE_PALETTERGB(crText)); + + SelectClipRgn(hdc, 0); + + ExtTextOut(hdc, x, y, ETO_OPAQUE, &cliprect, szText, lstrlen(szText), 0); + } + else + { + SetBkColor(hdc, MAKE_PALETTERGB(crBack)); + SetTextColor(hdc, crText);//MAKE_PALETTERGB(crText)); + + SelectClipRgn(hdc, 0); + + ExtTextOut(hdc, x, y, ETO_OPAQUE, &rect, szText, lstrlen(szText), 0); + } + + if(hIcon) + { + HBRUSH hbr = CreateSolidBrush(MAKE_PALETTERGB(crBack)); + DrawIconEx(hdc, ix, iy, hIcon, 32, 32, 0, hbr, 0); + DeleteObject(hbr); + } + +} + +void CardButton::AdjustPosition(int winwidth, int winheight) +{ + int width = rect.right-rect.left; + int height = rect.bottom-rect.top; + + width = width & ~0x1; + + switch(xjustify) + { + case CS_XJUST_NONE: + break; + + case CS_XJUST_CENTER: //centered + rect.left = (winwidth - (width)) / 2; + rect.left += xadjust; + rect.right = rect.left+width; + break; + + case CS_XJUST_RIGHT: //right-aligned + rect.left = winwidth - width; + rect.left += xadjust; + rect.right = rect.left+width; + break; + } + + switch(yjustify) + { + case CS_YJUST_NONE: + break; + + case CS_YJUST_CENTER: //centered + rect.top = (winheight - (height)) / 2; + rect.top += yadjust; + rect.bottom = rect.top+height; + break; + + case CS_YJUST_BOTTOM: //right-aligned + rect.top = winheight - height; + rect.top += yadjust; + rect.bottom = rect.top+height; + break; + } + +} + +int CardButton::OnLButtonDown(HWND hwnd, int x, int y) +{ + if((uStyle & CB_PUSHBUTTON) == 0) + return 0; + + //make sure that the user is allowed to do something + if(WaitForSingleObject(mxlock, 0) != WAIT_OBJECT_0) + { + return 0; + } + else + { + ReleaseMutex(mxlock); + } + + fMouseDown = true; + fButtonDown = true; + + Redraw(); + + SetCapture(hwnd); + + return 1; +} + +int CardButton::OnMouseMove(HWND hwnd, int x, int y) +{ + if(fMouseDown) + { + bool fOldButtonDown = fButtonDown; + + POINT pt; + + pt.x = x; + pt.y = y; + + if(PtInRect(&rect, pt)) + fButtonDown = true; + else + fButtonDown = false; + + if(fButtonDown != fOldButtonDown) + Redraw(); + } + + return 0; +} + +int CardButton::OnLButtonUp(HWND hwnd, int x, int y) +{ + if(fMouseDown) + { + fMouseDown = false; + fButtonDown = false; + + if(uStyle & CB_PUSHBUTTON) + { + Redraw(); + ReleaseCapture(); + } + + //if have clicked the button + if(parentWnd.CardButtonFromPoint(x, y) == this) + { + if(ButtonCallback) + { + ButtonCallback(*this); + } + else + { + HWND hwnd = (HWND)parentWnd; + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(id, BN_CLICKED), (LONG)hwnd); + } + } + } + + return 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) +{ + CardButton *cb; + + if(nNumButtons == MAXBUTTONS) + return 0; + + cb = new CardButton(*this, id, szText, uStyle, fVisible, x, y, width, height); + Buttons[nNumButtons++] = cb; + + if(uStyle & CB_PUSHBUTTON) + { + cb->SetBackColor(CardButton::GetFace(crBackgnd)); + //cb->SetBackColor(ScaleLumRGB(crBackgnd, 0.1)); + cb->SetForeColor(RGB(255,255,255)); + } + else + { + cb->SetBackColor(crBackgnd); + cb->SetForeColor(RGB(255,255,255)); + } + + return cb; +} + +void CardButton::SetText(TCHAR *lpszFormat, ...) +{ + int count; + + va_list args; + va_start(args, lpszFormat); + + count = wvsprintf(szText, lpszFormat, args); + va_end(args); +} + +int CardButton::Id() +{ + return id; +} + +void CardButton::Show(bool fShow) +{ + fVisible = fShow; +} + +void CardButton::Move(int x, int y, int width, int height) +{ + SetRect(&rect, x, y, x+width, y+height); +} + +void CardButton::Redraw() +{ + HDC hdc = GetDC((HWND)parentWnd); + + HPALETTE hOldPal = UseNicePalette(hdc, __hPalette); + + Draw(hdc, !fButtonDown); + + RestorePalette(hdc, hOldPal); + + ReleaseDC((HWND)parentWnd, hdc); +} + +void CardButton::SetForeColor(COLORREF cr) +{ + crText = cr; +} + +void CardButton::SetBackColor(COLORREF cr) +{ + crBack = cr; + + crHighlight = GetHighlight(cr); + crShadow = GetShadow(cr); + + //crHighlight = ScaleLumRGB(cr, +0.25); + //crShadow = ScaleLumRGB(cr, -0.25); +} + +// Static member +COLORREF CardButton::GetHighlight(COLORREF crBase) +{ + return ColorScaleRGB(crBase, RGB(255,255,255), 0.25); +} + +// Static member +COLORREF CardButton::GetShadow(COLORREF crBase) +{ + return ColorScaleRGB(crBase, RGB(0, 0, 0), 0.25); +} + +COLORREF CardButton::GetFace(COLORREF crBase) +{ + return ColorScaleRGB(crBase, RGB(255,255,255), 0.1); +} + +void CardButton::SetPlacement(UINT xJustify, UINT yJustify, int xAdjust, int yAdjust) +{ + xadjust = xAdjust; + yadjust = yAdjust; + xjustify = xJustify; + yjustify = yJustify; +} + +void CardButton::SetIcon(HICON hicon, bool fRedraw) +{ + hIcon = hicon; + + if(fRedraw) + Redraw(); +} + +void CardButton::SetFont(HFONT font) +{ + //don't delete the existing font.. + hFont = font; +} + +void CardButton::SetButtonProc(pButtonProc proc) +{ + ButtonCallback = proc; +} + +bool CardButton::Lock() +{ + DWORD dw = WaitForSingleObject(mxlock, 0); + + if(dw == WAIT_OBJECT_0) + return true; + else + return false; +} + +bool CardButton::UnLock() +{ + if(ReleaseMutex(mxlock)) + return true; + else + return false; +} + +void CardButton::SetStyle(UINT style) +{ + uStyle = style; +} + +UINT CardButton::GetStyle() +{ + return uStyle; +} _____
Added: trunk/rosapps/games/solitaire/cardlib/cardbutton.cpp.bak --- trunk/rosapps/games/solitaire/cardlib/cardbutton.cpp.bak 2005-03-10 03:50:43 UTC (rev 13903) +++ trunk/rosapps/games/solitaire/cardlib/cardbutton.cpp.bak 2005-03-10 04:04:27 UTC (rev 13904) @@ -0,0 +1,489 @@
+// +// CardLib - CardButton class +// +// Freeware +// Copyright J Brown 2001 +// +#include <windows.h> +#include <tchar.h> + +#include "cardlib.h" +#include "cardwindow.h" +#include "cardbutton.h" +#include "cardcolor.h" + +HPALETTE UseNicePalette(HDC, HPALETTE); +void RestorePalette(HDC, HPALETTE); + +void PaintRect(HDC hdc, RECT *rect, COLORREF colour); + +CardButton::CardButton(CardWindow &parent, int Id, TCHAR *szText, UINT Style, bool visible, + int x, int y, int width, int height) + + : parentWnd(parent), id(Id), fVisible(visible), uStyle(Style), ButtonCallback(0) +{ + crText = RGB(255,255,255); + crBack = RGB(0, 128, 0); + + xadjust = 0; + yadjust = 0; + xjustify = 0; + yjustify = 0; + + fMouseDown = false; + fButtonDown = false; + + hIcon = 0; + + SetText(szText); + Move(x, y, width, height); + + mxlock = CreateMutex(0, FALSE, 0); + + hFont = 0; +} + +CardButton::~CardButton() +{ + CloseHandle(mxlock); +} + +void CardButton::DrawRect(HDC hdc, RECT *rect, bool fNormal) +{ + RECT fill; + + HANDLE hOld; + + HPEN hhi = CreatePen(0, 0, MAKE_PALETTERGB(crHighlight)); + HPEN hsh = CreatePen(0, 0, MAKE_PALETTERGB(crShadow)); + HPEN hbl = (HPEN)GetStockObject(BLACK_PEN); + + int x = rect->left; + int y = rect->top; + int width = rect->right-rect->left - 1; + int height = rect->bottom-rect->top - 1; + + SetRect(&fill, x+1, y+1, x+width-1, y+height-1); + + int one = 1; + + if(!fNormal) + { + x += width; + y += height; + width = -width; + height = -height; + one = -1; + OffsetRect(&fill, 1, 1); + } [truncated at 1000 lines; 6293 more skipped]